我有一个成员函数返回const
对类实例的引用。
示例:
class State
{
const City* city1;
public:
State(const City& c) : city1(c) {}
const City& getReference() const {return *city1;}
void changeStuff();
};
如何使用const_cast和getReference()获取指向city1的非const City *
?
此外,通过执行以下操作,我可以在不使用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引用,甚至可以调用setter?
感谢您的关注
答案 0 :(得分:3)
City ref = state1.getReference(); //Why does it work?
它有效,因为那不是参考。你正在复制const值。试试这个:
City & ref = state1.getReference();
那不行。你可以像这样使用const cast:
City * ptr = const_cast<City*>(&state1.getReference());
确保对象不是真正的const。否则,实际尝试修改它是未定义的行为。
答案 1 :(得分:0)
如果你声明了某些东西是const
,就像你对编译器做出承诺一样,你永远不会改变那个东西的内容,你为什么要那样做呢?
如果你真的想要改变const类型的东西,你必须声明mutable
:
class A
{
public:
mutable int _change_me;
};
现在您可以更改成员_change_me
,即使您有class A
的const引用。