考虑以下代码:
class Bar
{
public:
int GetValue() const { return aVeryImportantValue; }
void SetValue(int value) { aVeryImportantValue = value; }
private:
int aVeryImportantValue;
};
class Foo
{
public:
Foo(const Bar &bar) : _bar(bar) {}
void SetBar(const Bar &bar) { _bar = bar; }//my compiler won't like this
int GetValue() const { return _bar.GetValue(); }
private:
const Bar &_bar;
};
如果我希望能够通过Foo“检查”不同的Bar对象,还要确保Foo不会实际更改Bar的内容,该怎么办?有可能吗?
答案 0 :(得分:4)
您可以使用指向常量对象的指针:
const Bar *_bar;
你可以切换一个有针对性的变量,并确保Foo不会改变它的状态。
class Foo
{
public:
Foo(const Bar *bar) : _bar(bar) {}
void SetBar(const Bar *other) { _bar = other; }
int GetValue() const { return _bar->GetValue(); }
private:
const Bar *_bar;
};
答案 1 :(得分:3)
初始化引用后,无法重新引用它以引用其他对象。相反,你应该使用指针。
class Foo
{
public:
Foo(const Bar &bar) : _bar(&bar) {}
void SetBar(const Bar &bar) { _bar = &bar; }
int GetValue() const { return _bar->GetValue(); }
private:
const Bar *_bar;
};
答案 2 :(得分:2)
您的代码不会编译,因为_bar是一个引用,只能初始化一次。只是摆脱SetBar函数,因为尝试修改const或引用对象是没有意义的。