Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多态性和私有数据成员 首先,我要明确的是,这个问题涉及Scott Meyers的书《有效C++》(第三版),具体地说,第22项:声明数据成员私有< /P>_C++_Oop_Architecture - Fatal编程技术网

多态性和私有数据成员 首先,我要明确的是,这个问题涉及Scott Meyers的书《有效C++》(第三版),具体地说,第22项:声明数据成员私有< /P>

多态性和私有数据成员 首先,我要明确的是,这个问题涉及Scott Meyers的书《有效C++》(第三版),具体地说,第22项:声明数据成员私有< /P>,c++,oop,architecture,C++,Oop,Architecture,我基本上理解它,并且正在尝试将一些东西应用到我的代码中来开始实践它。然而,我有一个案例,我不知道如何解决它。基本上我有一些抽象接口和一些继承,看起来像这样 class abstractSystem { ... protected: AbstractThing *_thing; } class DerivedSystem : public AbstractSystem { // inherits _thing so we can use it here. } 然而,这与

我基本上理解它,并且正在尝试将一些东西应用到我的代码中来开始实践它。然而,我有一个案例,我不知道如何解决它。基本上我有一些抽象接口和一些继承,看起来像这样

class abstractSystem {
    ...
protected:
    AbstractThing *_thing;
}

class DerivedSystem : public AbstractSystem {
    // inherits _thing so we can use it here.
}
然而,这与项目22不一致。我认为最好是为派生类提供一个基类接口,这在很多情况下都很好,但是在这种情况下,由于多态性被用来决定
\u事情
,我们会在getter中复制它,以便在派生系统中,我们需要访问它的任何时候都需要复制它

所以我猜这不太好,为了与第28项保持一致:避免返回“句柄”对象内部,我似乎不知道如果不复制
\u 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”的引用:

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

这将避免复制整个对象。

是的,它解决了问题,或者在许多方面解决了问题,但是它也与第28项不一致:避免返回“句柄”对象内部。对,我的示例返回常规引用将被视为句柄。然而,我认为返回常量引用将满足第28项的精神。我相应地改变了我的答案。是的,我认为这是最好的,关于悬挂手柄的风险有一些观点,但由于这是继承,我觉得在这方面它应该是相当可靠和可预测的。你想得太多了。Scott Meyers推荐最佳实践,而不是法律。如果派生类无论如何都要访问_thing(并且您不需要任何getter逻辑),只需保护成员本身即可。我认为您是正确的,答案(将其设置为已接受)提供了一种尽可能好地处理它的方法。但实际上,它只会变得更难理解,利用它是一场噩梦,至少如果你必须对它做非常量的事情,因为那时你必须提供一个非常量引用,这显然比拥有一个受保护的成员要糟糕得多。我想这里的关键是要指出,我是过度思考的受害者,这有助于我对解决方案感到满意。