Очередь без добавления объектов - C ++ 11 - PullRequest
1 голос
/ 09 ноября 2019

У меня есть два пользовательских класса, Passenger и Elevator, содержащиеся в заголовочном файле Passenger.h:

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

class Passenger
{
    public:

    explicit Passenger(int startTime, int startFloor, int endFloor, int waitTime){
        this->startTime = startTime;
        this->startFloor = startFloor;    
        this->endFloor = endFloor;
        this->waitTime = waitTime;
    }//end constructor

    void increaseWait(int increase){
        this->waitTime += increase;
    }

    int getWait(){
        return this->waitTime;
    }

    int startTime, startFloor, endFloor, waitTime;

}; //end passenger


class Elevator
{
    public:

    explicit Elevator(string the){
        status = "STOPPED";
        passengerCount = 0;
        name = the;        
    }//end constructor

    int addtoQueue(Passenger person){
        if (this->passengerCount < 8){
            this->pickupQueue.push(person);
            return 0;
        }else{
            cout << "Error -- full" << endl;
            return 1;
        } //end

    } //end addtoQueue

    void changePassengerCount(int change){
        passengerCount += change;
    }

    string getStatus(){
        return status;
    }

    void setStatus(string status){
        status = status;
    }

    void addStop(int location){
        stops.push(location);
    }

    int getStops(){
        return stops.size();
    }

    string getName(){
        return name;
    }

    int getRoute(){
        return stops.front();
    }

    bool checkCount(){
        if (passengerCount > 8){
            return false;
        }else{
            return true;
        }
    }

    int printCount(){
        return passengerCount;
    }

    void printQueue(){
        queue<int> copy = stops;

        while(!copy.empty()){
            cout << copy.front() << " ";
            copy.pop();
        }

        cout << endl;
    }

    private:
    string status;
    queue<Passenger> pickupQueue;
    int passengerCount;
    queue<int> stops;
    string name;

}; //end passenger

Я читаю файл csv вvector из Passenger объектов, а затем я хочу заполнить некоторые queue объекты в каждом Elevator объекте этими Passenger объектами. Однако кажется, что ни один из объектов в классе Elevator на самом деле не обновляется. Например, passengerCount и Queue Size никогда не идут выше единицы. Я не могу понять, почему.

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#include "Passenger.h"
using namespace std;

int time = 0;

int main(){
    vector<Passenger> passengers;
    Elevator elevatorOne = Elevator("elevatorOne");
    Elevator elevatorTwo = Elevator("elevatorTwo");
    Elevator elevatorThree = Elevator("elevatorThree");
    Elevator elevatorFour = Elevator("elevatorFour");
    vector<Elevator> elevators;
    elevators.push_back(elevatorOne);
    elevators.push_back(elevatorTwo);
    elevators.push_back(elevatorThree);
    elevators.push_back(elevatorFour);

    // Code removed when building the vector of passengers by reading in the csv

    for(unsigned int i = 0; i < passengers.size(); i++){
        //cout << "Currently evaluating passenger: " << i << endl;
        for (Elevator currElevator : elevators){
            // If the elevator hasn't moved
            // This is one of three logic checks, but the others have been removed at the request of SO users
            if(currElevator.getStatus().compare("STOPPED") == 0 && currElevator.getStops() == 0 && currElevator.checkCount() == true){                
                // Add the passenger's end floor to the current elevator's queue
                cout << "adding passenger " << i << " to elevator: " << currElevator.getName() << " because of condition 1 " << endl;
                currElevator.addStop(passengers[i].endFloor);
                currElevator.changePassengerCount(1);
                cout << "Queue Size: " << currElevator.getStops() << endl;
                cout << "Passenger Count: " << currElevator.printCount() << endl;
                if(passengers[i].endFloor > currElevator.getRoute()){
                    currElevator.setStatus("MOVING UP");
                } else{
                    currElevator.setStatus("MOVING DOWN");
                }

                break;                     
            } //end if

            else{
                // If none of these conditions match, move on to the next elevator
                continue;
            } //end else
        } //end looping through elevators
    } //end looping through passengers
} //end main

Я получаю результаты вроде:

adding passenger 0 to elevator: elevatorOne because of condition 1
Queue Size: 1
Passenger Count: 1
adding passenger 1 to elevator: elevatorOne because of condition 1
Queue Size: 1
Passenger Count: 1
adding passenger 2 to elevator: elevatorOne because of condition 1
Queue Size: 1

Но ожидаю увидеть:

adding passenger 0 to elevator: elevatorOne because of condition 1
Queue Size: 1
Passenger Count: 1
adding passenger 1 to elevator: elevatorOne because of condition 1
Queue Size: 2
Passenger Count: 2
adding passenger 2 to elevator: elevatorOne because of condition 1
Queue Size: 3
Passenger Count: 3

и т. Д.

1 Ответ

1 голос
/ 10 ноября 2019

Извинения за тупой вопрос.

Замена:

for (Elevator currElevator : elevators){

на:

for (int j = 0; j < elevators.size(); j++){

и все вызовы для currElevator до elevators[j] исправилипроблема.

Я не уверен, в настоящее время, , почему это будет иметь эффект, но обновит этот ответ дальнейшими исследованиями.

ОБНОВЛЕНИЕ

Per Corristo: Причина, по которой это произошло, заключается в том, что currElevator внутри цикла for на основе диапазона является копией лифта в векторе elevators. Если вы объявляете свой цикл for на основе диапазона как для (Elevator& currElevator : elevators), он должен работать, потому что теперь currElevator является ссылкой на элемент вектора elevators вместо копии.

...