提供以下课程:
class Foo
{
public:
//...
private:
Bar mBar;
};
是否可以以一种可以访问其成员的方式公开mBar
成员,但不能公开mBar
对象本身?
原因是用户应该能够访问mBar
的所有成员,但不能向Bar
分配另一个mBar
实例。
Bar
的成员很多,因此为他们编写吸气剂/设定剂并转发功能将很麻烦。但是,如果将mBar
设为公开,则可以执行aFoo.mBar = Bar(/*...*/);
,这是唯一不应允许的事情。
不能删除Bar
的赋值运算符。
答案 0 :(得分:4)
如果您只想防止错误,而不是Machiavelli,则operator->
可能会有所帮助(您可能希望使用包装器,而不是直接将其放在foo中):
class Foo
{
public:
//...
const Bar* operator ->() const { return &mBar; }
Bar* operator ->() { return &mBar; }
private:
Bar mBar;
};
如此
Foo foo;
foo->bar_member;
foo.foo_member;
// Machiavelli
*foo.operator->() = Bar();
答案 1 :(得分:1)
我可能会重新考虑您的设计,但这是使用中间get
方法的一种间接方法:
struct Bar {
int intAttr;
};
class Foo {
Bar mBar;
public:
template <class U>
U& get(U Bar::* p) {
return mBar.*p;
}
};
通过这种方式,您可以使用以下方式访问mBar
的任何公共成员:
Foo foo;
foo.get(&Bar::intAttr); // get
foo.get(&Bar::intAttr) = 0; // set