2010-05-21 40 views
4
void foo(const ClassName &name) 
{ 
    ... 
} 

如何訪問類實例名的方法?通過類的const引用

name.method()沒有工作。那麼我試過了:

void foo(const ClassName &name) 
{ 
    ClassName temp = name; 
    ... .... 
} 

我可以使用temp.method,但在foo執行後,原來的名字搞砸了,有什麼想法嗎? BTW,名稱的成員變量沒有搞砸,但是它是類的子類的成員變量。

+0

這將有助於瞭解有關正在傳入的類的信息。 – 2010-05-21 08:36:54

回答

4

如果我理解正確,你想在foo()裏面調用name.method(),編譯器不會讓你。難道ClassName::method()是一種非const方法嗎?由於name被聲明爲const參數foo(),因此您只能調用const函數。

更新:如果ClassName::method()是非常量,但實際上並沒有改變狀態,最好是當然的,使其const。如果你因爲某些原因,我看到了以下幾種方式:

  • (明顯的方式,如@Naveen指出的 - 感謝:-)聲明name作爲一個非const方法的參數。
  • 製作name的非常量副本,並調用method就可以了 - 就像你實際做的那樣。但是,只有在賦值運算符和/或複製構造函數適用於ClassName的情況下才有效。然而,你寫了「foo被執行後,原來的名字搞砸了」,這是一個非常模糊的描述,但它可以被解釋爲複製在name上有一些不需要的副作用,這表明這些函數不是正確執行或完全執行。
  • (討厭的方式)用const_cast拋棄constability - 這應該是真的是最後的手段,並且只有當您確定ClassName::method()實際上沒有改變任何狀態。

UPDATE2,以@ AKN的評論 - 例如虛擲常量性:

void foo(const ClassName &name) 
{ 
    ClassName& temp = const_cast<ClassName&>(name); 
    ... .... 
} 
+0

ClassName :: method()是一個非const方法。我想如果有一種方法可以解決這個問題,如果ClassName :: method()是非const。因爲所有我需要的是知道名稱的一些信息,我不想改變它 – 2010-05-21 08:42:24

+0

@small_potato:你爲什麼不把method()作爲const方法? – Naveen 2010-05-21 08:45:01

+1

@small:解決它的方法是使'ClassName :: method()'爲一個const方法:'ClassName :: method()const'。 http://www.parashift.com/c++-faq-lite/const-correctness.html提供了很多很好的信息。 – 2010-05-21 08:45:52

6

去您所提供的描述,它看起來像在ClassNamemethod()是一個非const方法。如果你試圖在const對象上調用一個非const方法,編譯器會拋出一個錯誤。當你做了ClassName temp = name;你創建了一個拷貝的變量到一個臨時的非const對象temp。您可以調用此對象上的任何方法,但因爲它是副本,所以在此對象上所做的修改將不會反映在name對象中。

編輯

來解決它的最好方法,就是讓ClassName::method常量,如果它不修改任何成員變量。如果是這樣,則不應將函數foo中的參數作爲常量參考。您應該將參數作爲非const引用。

相關問題