【问题标题】:Queue not adding objects - C++ 11队列不添加对象 - C++ 11
【发布时间】:2019-11-09 20:43:06
【问题描述】:

我有两个自定义类,PassengerElevator 包含在 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 文件读入Passenger 对象的vector,然后我想做的是用Passenger 对象在每个Elevator 对象中填充一些queue 对象。但是,似乎Elevator 类中的所有对象都没有实际更新。例如,passengerCountQueue Size 永远不会超过 1。我不知道为什么。

#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

【问题讨论】:

  • 代码太多。做一个minimal reproducible example
  • 我想少发些帖子,但我认为显示正在创建的Passengersvector 很重要。我不应该吗?
  • 所以你是说,要重现错误,上述代码中的每一个功能都需要存在?这是一个依赖于所有这些逻辑位之间的交互的错误?您试图从责备中消除上述代码的某些部分,并且即使删除其中一个错误也会消失?因为,如果不是,它就不是minimal reproducible example。我们每天收到数千个帖子。 缩小范围,我们会修复它。 :) 祝你好运。
  • 没错。为了重现错误,了解这两个自定义类很重要,因为这是错误出现的地方;在这些类里面。因此,头文件必须存在。在 main 函数中,它可能很重要(如果我回答这个问题,我认为它很重要)。

标签: c++ c++11 stl queue


【解决方案1】:

为一个愚蠢的问题道歉。

替换:

for (Elevator currElevator : elevators){

与:

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

所有对currElevatorelevators[j] 的调用都解决了这个问题。

目前我不确定为什么会产生影响,但会通过进一步研究更新此答案。

更新

每科里斯托: 发生这种情况的原因是基于范围的 for 循环内的 currElevatorelevators 向量中电梯的副本。如果您将基于范围的 for 循环声明为 for (Elevator&amp; currElevator : elevators),它应该可以工作,因为现在 currElevator 是对 elevators 向量中元素的引用,而不是副本。

【讨论】:

  • 发生这种情况的原因是基于范围的for 循环内的currElevatorelevators 向量中电梯的副本。如果您将基于范围的 for 循环声明为 for (Elevator&amp; currElevator : elevators) 它应该可以工作,因为现在 currElevator 是对 elevators 向量中元素的引用而不是副本。
猜你喜欢
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 2021-09-22
  • 2023-03-17
相关资源
最近更新 更多