2011-02-15 40 views
18

我有一個傳統的功能,看起來像這樣內的非const功能:如何調用一個const函數(C++)

int Random() const 
{ 
    return var_ ? 4 : 0; 
} 

,我需要這樣,現在來調用遺留代碼中的功能看起來是這樣的:

int Random() const 
{ 
    return var_ ? newCall(4) : 0; 
} 

的問題是,我得到這個錯誤:

In member function 'virtual int Random() const': 
class.cc:145: error: passing 'const int' as 'this' argument of 'int newCall(int)' discards qualifiers 

現在我知道爲了解決THI s錯誤我可以讓我的newCall() const函數。但後來我在newCall()有幾個funciton調用,所以我現在必須做所有這些函數調用const。等等等等,直到最終我覺得我的一半程序將會是const。

我的問題:有什麼辦法可以在Random()中調用一個不是const的函數嗎?或沒有任何人有任何想法如何實現newCall()Random()而不使我的程序一半const。

感謝

如果您確定新呼叫不會修改 「這個」 -josh

+0

你可以使Random()非const。 – GWW 2011-02-15 19:30:19

+0

我想但Random()是我無法真正觸及的遺留代碼。 – Grammin 2011-02-15 19:31:12

+1

這是4選擇一個無偏見的骰子(從而使它真的是隨機的)。 – 2011-02-15 19:49:36

回答

17

應該改變你的程序中使用/正確聲明常量...

一個替代方案是用const_cast。

0
const_cast<MyClass *>(this)->newCall(4) 

只有做到這一點。

12
int Random() const 
{ 
    return var_ ? const_cast<ClassType*>(this)->newCall(4) : 0; 
} 

但這不是一個好主意。避免如果可能!

0

如果不使用const轉換,您可以嘗試在Random()方法中創建類的新實例嗎?

0

const預選賽斷言類的實例this將是操作的東西,編譯器不能自動地推導出後保持不變。

const_cast可以使用,但其邪惡

1

這裏有兩種可能性。首先,newCall及其所有被調用者實際上都是非修改函數。在這種情況下,你應該完全通過並標記全部const。您和未來的代碼維護人員都會感謝您讓代碼閱讀變得更加容易(這裏的個人體驗發言)。其次,newCall實際上可以改變對象的狀態(可能通過它調用的某個函數)。在這種情況下,您需要中斷API並使non-const正確指示調用方修改對象狀態(如果修改隻影響物理常量,而不是邏輯常量,則可以使用可變屬性並傳播const)。

0

如果它實際上是一個隨機數發生器,那麼數字生成代碼/狀態可能會放在類本地靜態生成器中。這樣,您的對象不會發生變化,並且方法可能保持不變。