-3

这是使用 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 实例的值会立即更改。

4

2 回答 2

1

您正在使用vector带有Flight类的 a ,因此为了使向量正确复制Flight对象,它需要 aoperator =和 a 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值。

您可以检查的唯一另一点是 的值i:我假设您已将其初始化为 0?

我将在您的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:

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();
    }
};

现在,如果你有一个vectorTime

vector<Time> times;

你可以愉快地去:

AtomicTime at;
times.push_back(at);

而且您不必担心核反应堆;-)

于 2012-05-24T16:41:57.583 回答
1

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

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

至:

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

另外,您可以发布您Flight班级的代码吗?

于 2012-05-25T11:46:23.177 回答