【发布时间】:2016-09-10 22:09:44
【问题描述】:
首先我想明确指出,这个问题与 Scott Meyers 的《Effective C++》(第 3 版)一书有关,特别是第 22 项:声明数据成员私有
我确实基本了解它,并且正在尝试将一些东西应用到我的代码中以开始练习它。但是我有一个案例,我不确定如何解决它。基本上我有一些像这样的抽象接口和一些继承。
class abstractSystem {
...
protected:
AbstractThing *_thing;
}
class DerivedSystem : public AbstractSystem {
// inherits _thing so we can use it here.
}
然而,这与第 22 条不一致。我认为最好为派生类提供到基类的接口,这在许多情况下工作得有些好,但在这种情况下,因为多态性用于决定_thing 我们会在 getter 中复制它,以便在派生系统中,任何时候我们需要访问它都需要复制它。
所以我猜这不是很好,并且要与 第 28 项保持一致:避免返回“句柄”对象内部如果不复制 _thing,我似乎无法弄清楚如何做到这一点:
class AbstractSystem {
protected:
AbstractThing thing() { return *_thing; }
private:
AbstractThing *_thing;
}
class DerivedSystem {
// now we need to use thing() to access _thing implying copy
}
这是必须完成的方式吗?复制(如果经常复制的话)是否对性能有点困难?
我猜可能是我的设计有问题。
【问题讨论】:
-
你想多了。 Scott Meyers 推荐最佳实践,而不是法律。如果派生类无论如何都可以访问 _thing(并且您不需要任何 getter 逻辑),只需让成员本身受到保护。
-
我认为您是正确的,答案(使其被接受)提供了一种尽可能好的处理方法。但实际上它只会变得更加难以理解,并且使用它是一场噩梦,至少如果你必须对它做非常量的事情,那么你将不得不提供一个非常量的参考,这显然是一个非常比拥有受保护成员更糟糕的主意。我认为这里的关键是指出我成为过度思考的受害者,这有助于我继续对解决方案感到满意。
标签: c++ oop architecture