【问题标题】:Polymorphism and private data members多态性和私有数据成员
【发布时间】: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


【解决方案1】:

您可以返回对“事物”的引用:

protected:
    AbstractThing const& thing() { return *_thing; }

这样可以避免复制整个对象。

【讨论】:

  • 是的,它在某种程度上解决了问题,或者它在很多方面确实,但是它也与第 28 条不连贯:避免返回“句柄”对象内部.
  • 对,我的示例返回常规引用将被视为句柄。但是,我认为返回一个 const 引用将符合第 28 条的精神。我相应地更改了答案。
  • 是的,我认为这已经很好了,关于悬垂句柄的风险有一些观点,但由于这是继承,我觉得在这方面应该是相当可靠和可预测的。
猜你喜欢
  • 1970-01-01
  • 2020-03-22
  • 2013-04-05
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多