2011-12-13 42 views
1

我有一個成員函數返回一個const引用類的一個實例。如何獲取對象的const引用並使用該引用更改對象(使用const_cast)?

例子:

class State 
{ 
    const City* city1; 
public: 
    State(const City& c) : city1(c) {} 
    const City& getReference() const {return *city1;} 
    void changeStuff(); 
}; 

我如何獲得一個非const City *使用的const_cast和getReference()指向city1?

而且,這樣做我能做到我想要的東西,而無需使用的const_cast如下: (假設已經有一個國家叫state1一個實例)

City ref = state1.getReference(); //Why does it work? 
City * ptr = &ref; //This is what I wanted, but not this way 
ref->changeStuff(); //How can I call functions changing things if the reference was constant? 

我怎麼能得到一個非-const引用來自返回const引用的函數,甚至是調用者?

感謝您的關注

+1

爲什麼你想要一個非const指針?這似乎違反了恆常的全部目的。 – templatetypedef

+0

我只是想問templatetypedef同樣的問題。如果你想'入侵',請明確澄清,以免人們不會因爲告訴你的設計錯誤而嘮叨你。 – tia

+0

這有點複雜。首先,你的'State'類甚至不是有效的C++代碼(你正在向ctor中的指針投擲引用)。然而,更令人困惑的是,'changeStuff'是'State'的成員,但是你想用'City'對象調用它(這兩種類型都發生同樣的方法嗎?爲什麼還要在這裏提到它?)。另外,你的'ref'變量不是一個參考。 – bitmask

回答

3
City ref = state1.getReference(); //Why does it work? 

它的作品,因爲這不是一個參考。您正在製作const值的副本。試試這個:

City & ref = state1.getReference(); 

這是行不通的。你可以這樣使用const cast:

City * ptr = const_cast<City*>(&state1.getReference()); 

只要確定對象不是真的是const。否則,它是未定義的行爲,實際上試圖修改它。

+0

非常簡潔明瞭,謝謝。 – Artie

0

如果你聲明的東西是const,就像你做一個承諾,編譯器,你將永遠不會改變那個東西的內容,爲什麼你要這麼做?

如果你真的想改變一些東西在常量類型,您必須聲明,mutable

class A 
{ 
public: 
mutable int _change_me; 
}; 

現在,你甚至可以你有class A常量引用更改成員_change_me

+0

情況並非如此。引用是常量,這並不一定意味着它所引用的對象也是不變的。 – Artie