我有一个类Foo
,看起来像这样
class Foo
{
public:
void set_bar(int val)
{
_bar = val;
}
protected:
int _bar;
};
由类Baz
继承,声明如下:
class Baz
: public Foo
{
public:
void set_baz(int val)
{
_baz = val;
}
protected:
int _baz;
};
然后我有一个Factory
类,其中包含Baz
类型的成员变量。
class Factory
{
protected:
Baz _baz;
public:
const Baz& get_baz() const
{
return _baz;
}
};
如果我这样使用Factory
:
Factory f;
f.get_baz().set_bar(1);
抛出此error C2662: 'Foo::set_bar' : cannot convert 'this' pointer from 'const Baz' to 'Foo &'
答案 0 :(得分:1)
get_baz
返回的对象是常量,您无法修改其内容。
答案 1 :(得分:1)
您需要提供一个非const版本的Factory :: get_baz,它返回对Baz的非const引用:
class Factory
{
protected:
Baz _baz;
public:
const Baz& get_baz() const
{
return _baz;
}
Baz& get_baz()
{
return _baz;
}
};
使用const Factory时,将调用get_baz的const版本,否则将调用get_baz的非const版本。
您还应该避免在名称中使用前导下划线。请参阅What are the rules about using an underscore in a C++ identifier?。
答案 2 :(得分:0)
调用get_baz后,你得到常量对象,而常量对象只能调用常量函数。
答案 3 :(得分:0)
如果向对象返回非const引用,则只能更改该值。
如果您返回非const引用,为什么不将该成员公开?你会得到同样的效果......