这是使用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实例的值立即更改。
答案 0 :(得分:1)
您正在使用vector
,Flight
类,因此为了让向量正确复制Flight
对象,它需要operator =
和{ {1}}。你在copy constructor
班中有这些:
Flight
因此,请确保使用复制构造函数和class Flight {
public:
Flight(const Flight ©);
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
课程的代码吗?