2017-12-12 21 views
1
#include <iostream> 
#include <cstdlib> 

using namespace std; 

class Passenger { 
private: 
     int ticket ; 
     int half ; 
    public: 
     Passenger(int ticket=rand() % 2, int half=rand() % 2) {     // Construct passenger 
       cout << "passenger was constructed with " << ticket << " ticket and " << half << " half ticket" <<endl; 
     } 
     ~Passenger() { 
       cout << "passenger was destructed" <<endl; 
     } 

     int getTicket()const{ 
      cout << ticket <<endl; 
      return ticket; 
     }; 

     int getHalf()const{ 
      return half; 
     }; 
}; 


int main(){ 
    Passenger m; 
    m.getTicket(); 
} 

getTicketは、コンストラクタが呼び出されたときに出力される0または1ではなく、常に64を出力します。クラスgetter rand変数

私はこれでそれを修正できなかったと私にはわからないというのrand()

+0

あなたの実際の問題とは別のコードで別の問題は、ヘッダーに 'using namespace std'を使用しないでください。 STLが大きいため、簡単に衝突することがあります。後でネームスペースを書き出さない場合は、 'std :: cout;を使用する 'などとしてください。 – Aziuth

答えて

2

あなたはコンストラクタPassengerのパラメータのデフォルト値を提供しているが、あなたはあなたのクラス属性を初期化していないため、多くの事チケットと半分。

デフォルト値でPassenger::Passengerにそれらのパラメータを初期化しているかもしれませんが、あなたはあなたの関数のメンバーにそれらのパラメータを割り当てない限り、属性Passenger::ticketPassenger::halfは、あなたが一見それらに割り当てる値で初期化されることはありません。次のように

は本質的に、あなたはあなたのコンストラクタを更新する必要があります。下記のようあなたはまた、初期化リストを使用することができます

Passenger::Passenger(int ticket=rand() % 2, int half=rand() % 2) { 
    // Construct passenger 
    cout << "passenger was constructed with " << ticket << " ticket and " << half << " half ticket" <<endl; 
    this->ticket = ticket; 
    this->half = half; 
} 

class Passenger { 
    Passenger(int ticket=rand() % 2, int half=rand() % 2) : ticket(ticket), half(half) {} 
    ... // Rest of the class definition 
}; 
+0

旅客(int t、int h):チケット(t)= rand()%2、半分(h)= rand()%2) これは初期設定として正しいでしょうか? –

+0

初期化リストを使用することも別の方法です。 – ilim

+2

これを追加するには、John Johnに変数シャドウイングという用語を読み込ませることをお勧めします。答えは正しかったが、ジョンはこのコンセプトに精通しておらず、どのような場合でも「これ」が必要であると考えるだろう。 – Aziuth

関連する問題