首先我想讲清楚这个问题涉及到斯科特迈尔斯的书有效的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
}
这是它必须完成的方式吗?复制的性能不是很难(如果相当频繁地完成)?
我想这可能是我的设计错了。
你正在推翻这一点。斯科特迈尔斯建议最佳做法,而不是法律。如果派生类可以访问_thing而不管什么(并且你不需要任何getter逻辑),只需使该成员本身受保护。 – denniskb
我认为你是正确的,答案(接受它)提供了一种处理它的方式。但是真的只会变得更加难以理解,并且使用它是一场噩梦,至少如果你必须对它做非const的东西,那么你将不得不提供一个非const引用,这显然是一个很大的比拥有受保护的成员更糟糕的想法。我认为这里的关键是指出我是过度思考的受害者,这有助于我对解决方案感到满意。 – qrikko