2012-01-18 56 views
1

我正在實現一個類(或者說一個Base類,並從它繼承的類),它持有一個Integer。現在我有這個問題,我只能指針返回值一次。:錯誤的第二個返回值IntObject.getValue()

Inte foo = Inte(5); 
cout << foo.getValue() << endl; // 5 
foo.setValue(10); 
cout << foo.getValue() << endl; // 10 
cout << foo.getValue() << endl; // 4199696 

的getValue函數並不做任何事情,除了返回指針,我不知道爲什麼它後返回4199696第一個getValue()。

這裏我的課:

class Object { 

public: 
    virtual int getValue() = 0; 
    virtual void setValue(int *pointer) = 0; 
    virtual string toString() = 0; 

}; 


class Inte : public Object { 
private: 
    int* value; 
public: 
     Inte (int *val){ 
      value = val; 
     } 

     Inte (int val){ 
      int a = val; 
      value = &val; 
     } 

     virtual int getValue(){ 
      return *value; 
     }; 

     virtual void setValue(int *pointer){ 
      value = pointer; 
     }; 

     virtual void setValue(int val){ 
      int a = val; 
      value = &val; 
     }; 

     virtual string toString(){ 
      stringstream ss; 
      string s; 
      ss << value; 
      ss >> s; 
      return s; 
     }; 
}; 
+0

請注意,'toString()'不返回任何內容。 – hmjd 2012-01-18 14:19:56

+0

現在呢,謝謝:) – pharno 2012-01-18 14:22:21

回答

2
virtual void setValue(int val){ 
    int a = val; 
    value = &val; 
}; 

在此功能中存儲一個局部變量(val)的地址。一旦此函數退出,該地址將變爲無效,從而嘗試解除引用該地址undefined behavior的指針(這是您在getValue中執行的操作)。

+0

謝謝。但爲什麼它爲getValue()的第一個調用工作?以及我如何修復它? – pharno 2012-01-18 14:18:25

+0

@pharno:未定義的行爲意味着任何事情都可能發生。這包括它可以工作一次,兩次或更多,但在某種程度上僅僅因爲沒有明顯原因而失敗。爲了解決這個問題,你必須動態地創建一個新的'int'對象:'value = new int(val)' - 注意這會引入大量新問題,就像現在進入手動資源管理的世界。 – 2012-01-18 14:24:46

+0

「未定義的行爲」意味着編譯器和語言都不再關心你的程序做了什麼或者它爲什麼做。可以是任何結果的原因,實際上,它是在程序的地址空間中隨機數據加載到內存之前開始的。 – bronekk 2012-01-18 14:30:01