int变量在向量中推回后改变值(C ++)

时间:2012-05-24 16:34:22

标签: c++ vector integer

这是使用Time类的类,以及“魔法”发生的地方。 数据从文本文件中取出

    while(i<flightsNumber){
        if(ist>>nameArr>>arr>>airline>>fare>>time){
            Flight flight(dep,arr,nameArr,airline,fare,time);
            flightVector.push_back(flight);
            //pre-check
            cout<<flight.getTime()<<endl;
        }
        else
            error("Error: programData.dat contains invalid data");  
        //post-check
        cout<<flightVector[i].getTime()<<endl;
        i++;
    }

这是我的MyTime课程

#include "MyTime.h"

MyTime::MyTime()
    :h(0),m(0){
}

MyTime::MyTime(int hh,int mm)
    :h(hh),m(mm){

    if(hh<0 || mm<0 || mm>59)
        error("Time(): invalid construction");
}

void MyTime::setTime(int hh,int mm){
    if(hh<0 || mm<0 || mm>59)
        error("setTime(): invalid time");
    h=hh;
    m=mm;
}

int MyTime::getHour() const{
    return h;
}

int MyTime::getMinute() const{
    return m;
}


istream& operator>>(istream& is,MyTime& time){
    char ch1;
    int hour,minute;
    is>>hour>>ch1>>minute;
    if(is){
        if(ch1==':'){
            time.h = hour;
            time.m = minute;
        }
        else
            is.setstate(ios_base::failbit);
    }
    else
        is.setstate(ios_base::failbit);
    return is;
}

ostream& operator<<(ostream& os,const MyTime& time){
    return os<<time.h<<":"<<time.m;
}

输出是:

1:12

-33686019: -1414812757

这究竟是怎么回事?

在执行push_back()函数后,MyTime实例的值立即更改。

2 个答案:

答案 0 :(得分:1)

您正在使用vectorFlight类,因此为了让向量正确复制Flight对象,它需要operator =和{ {1}}。你在copy constructor班中有这些:

Flight

因此,请确保使用复制构造函数和class Flight { public: Flight(const Flight &copy); const Flight &operator=(const Flight &); virtual ~Flight(); /* Good practice, esp. when using containers */ // etc } 运算符来复制=值。

你能检查的唯一另一点是Time的价值:我假设你已经把它推到了0?

我将在i课上演示复制构造函数和operator =,只是为了简单起见:

Time

因此,使用此代码,我可以将class Time { protected: int h,m; public: Time() { h=m=0; } Time(int hour, int minute) : h(hour), m(minute) {} Time(const Time &rhs) { operator=(rhs); } virtual ~Time() {} const Time &operator=(const Time &rhs) { h = rhs.h; m = rhs.m; return rhs; } }; 值存储到Time中。我也可以自然地使用vector<Time>与时间:

=

Time a(12,0); Time b = a; Time c; c = b Time d(a); 析构函数意味着当virtual删除它所拥有的vector个实例时,它将使用虚拟析构函数。这对于这个例子并不是特别有用(因此我保持析构函数为空),但是派生类可能需要特定的析构函数。例如:

Time

现在,如果您有class AtomicTime : public Time { public: AtomicTime() { lockNuclearReactor(); } virtual ~AtomicTime() { releaseNuclearReactor(); } }; vector类:

Time

你可以高兴地去:

vector<Time> times;

你不必担心核反应堆; - )

答案 1 :(得分:1)

根据上面答案的评论,假设您的Time和Flight类只包含值或自我管理对象,您应该将实例放入vector。这似乎表明您的向量索引i可能有问题。如果更改线路会发生什么:

cout<<flightVector[i].getTime()<<endl;

为:

cout << (flightVector.rbegin())->getTime() << endl;

另外,您可以发布Flight课程的代码吗?