2016-05-14 52 views
1

首先我想讲清楚这个问题涉及到斯科特迈尔斯的书有效的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 
} 

这是它必须完成的方式吗?复制的性能不是很难(如果相当频繁地完成)?

我想这可能是我的设计错了。

+1

你正在推翻这一点。斯科特迈尔斯建议最佳做法,而不是法律。如果派生类可以访问_thing而不管什么(并且你不需要任何getter逻辑),只需使该成员本身受保护。 – denniskb

+0

我认为你是正确的,答案(接受它)提供了一种处理它的方式。但是真的只会变得更加难以理解,并且使用它是一场噩梦,至少如果你必须对它做非const的东西,那么你将不得不提供一个非const引用,这显然是一个很大的比拥有受保护的成员更糟糕的想法。我认为这里的关键是指出我是过度思考的受害者,这有助于我对解决方案感到满意。 – qrikko

回答

1

你可以参考返回到“东西”:

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

这将避免复制整个对象。

+1

是的,它解决了这个问题,或者它在许多方面都会**,但是它也是不连贯的。*项目28:避免返回“句柄”对象内部*。 – qrikko

+1

对,我的示例返回一个常规引用​​将被视为一个句柄。然而,我认为返回一个const引用会符合项目28的精神。我相应地改变了我的答案。 – mikero

+0

是的,我认为这样做会很好,对于悬挂手柄*的风险有一些观点,但由于这是继承,我觉得在这方面它应该是相当可靠和可预测的。 – qrikko