【发布时间】:2019-06-15 12:17:00
【问题描述】:
给定以下类:
class Foo
{
public:
//...
private:
Bar mBar;
};
是否可以公开mBar 成员,使其成员可以被访问,而不是mBar 对象本身?
原因是用户应该能够访问mBar 的所有成员,但他们不能将另一个Bar 实例分配给mBar。
Bar 有很多成员,为他们编写 getter/setter 和转发函数会很麻烦。但是,如果mBar 公开,则可以做aFoo.mBar = Bar(/*...*/);,这是唯一不应该被允许的事情。
删除Bar 的赋值运算符不是一种选择。
【问题讨论】:
-
是否从
Bar继承一个选项(在您的特定设计计划中)? -
你想让
mBar的成员可以被外部用户修改吗? -
提供getter
const Bar& getBar() const { return mBar;}? -
aFoo.mBar = Bar(/*...*/); ... 是唯一不应该被允许的事情 - 但是应该允许为
mBar成员分配新值? -
设计合理吗?您能否将理论上的
Foos 和Bars 替换为有助于可视化您要完成的工作的名称?一个想法:将Bar包装在一个不可复制/可移动的容器中,并像@Jarod42 建议的那样公开它,只有非常量。
标签: c++ wrapper encapsulation forwarding