2011-05-13 78 views
0

我有這些類:多態性問題C++

class A 
{ 
}; 

class B : public A 
{ 
public: 
    B(int val); 
private: 
    int* m_int; 
}; 

B::B(int val) 
{ 
    m_int = &val; 
} 

我打電話,像這樣的代碼,裏面1個功能,我知道一旦他們超出範圍的增值經銷商將被摧毀,但我只需要他們在這個功能:

{ 
... 
int _int = 0; 
B obj(_int); 
A *obj2 = &obj; 
_int++; 
... 
} 

問題是_int正在更改爲1,但m_int保持不變。我需要m_int來反映_int中的值,而不需要用代碼進行更新。我認爲有一個指向內存位置的指針會起作用?

第二個問題是,當我將鼠標懸停在obj2上以查看obj的值時,我收到消息「兒童無法評估」。

+5

你的代碼是否被編譯? – iammilind 2011-05-13 09:26:47

+0

您發佈的代碼無法編譯。首先,B的構造函數沒有被聲明,其次,在該構造函數中,您將'm_int'設置爲'ref'的地址,這在代碼中無處可見。 – Darhuuk 2011-05-13 09:28:00

+0

@iammiling是什麼意思是你的代碼不應該編譯,因爲'B'沒有一個構造函數需要'int'。 – 2011-05-13 09:28:45

回答

1

指針m_int將保持不變,但指出*m_int會改變,你還必須通過引用傳遞的價值val到功能。

編輯:看到你編輯的問題,因爲這是從構造函數中完成,你可以這樣做:

class B : A 
{ 
public: 
    B(int& val) : m_int(val) {} 
private: 
    int& m_int; 
}; 

要讓m_int參考同一個變量。

+0

存儲這樣的參考我收集我不需要做: – maffo 2011-05-13 10:06:20

+0

B :: B(INT&VAL) { m_int = &val; } 當我使用該代碼 – maffo 2011-05-13 10:06:32

+0

賓果,嘗試這樣做,它的工作完美, 謝謝! – maffo 2011-05-13 10:15:17

0

如果你想改變_int的值,你應該傳遞它的指針,他們現在所做的方式是按值調用。

B::B(int* val) 
{ 
    m_int = val; // not ref 
} 

和m_int應該是類型int*int

對於第二個問題,你存儲派生類的值,在指針的基礎,所以當你嘗試看看裏面有什麼OBJ 2只看到類型base的部分,這就是爲什麼你得到的消息不能被評估。
編輯 -
如果您想查看obj2中的實際內容,則應該再次將其轉換爲派生類型。而你可能並不總是知道在運行時...

+0

@AtoMerZ我見過在線教程中,如果你想指向派生類,那麼你這樣做: 'B obj2;' 'A * obj = &obj2;' 這不是正確的方法嗎? – maffo 2011-05-13 11:30:27

+0

@PoiXen這通常是在你有不同類的不同對象從同一個基類派生時完成的,那麼你將它們全部存儲在一個指向基類的指針數組中。或者在類似的情況下你有一個函數參數。否則,**不需要**將派生類存儲在基類指針中,儘管您可以**。 – atoMerz 2011-05-13 11:45:29

+0

@AtoMerZ問題是。我需要將派生類存儲在一個基本指針中,然後存儲在一個基本指針向量中。像這樣: 'A * obj = &obj2;' 'std :: vector vec;' 'vec.push_back(obj);' – maffo 2011-05-13 11:51:37

3

我也不太清楚以下是對於一個新手來說很好的意見,但使用這樣的引用將工作:

class B : A 
{ 
public: 
    explicit B(int& val); 
private: 
    int* m_int; 
}; 

B::B(int& val) 
{ 
    m_int = &val; 
} 

我有點擔心它實際上是設計不好的一個標誌。如果只是爲了學習的目的,正前方去,理解總是很重要的

+1

+1這個警告有一定的生命期問題。與 – 2011-05-13 09:43:37