-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ため、ベクトルがFlightオブジェクトを正しくコピーするには、 と が必要operator =です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();
    }
};

vectorここで、 ofTimeクラスがある場合:

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 に答える