关于Access Specifier的困惑

时间:2014-02-17 19:06:28

标签: c++

我目前正在阅读 SFML游戏开发这本书。我得到了它,因为在整本书中,我将使用SFML API和(更重要的是)C ++ 11开发整个游戏。我真的很喜欢通过实际使用它们来介绍所有新功能,而不是阅读它们的参考样式。

然而,我真的没有得到一小部分代码。 (也许我无法理解甚至不需要对C ++ 11做任何事情,它肯定与SFML无关。)

请查看SceneNode.hpp

class SceneNode
{
    public:
        // ...
        void attachChild(std::unique_ptr<SceneNode> child);
        // ...
    private:
        std::vector<std::unique_ptr<SceneNode>> mChildren;
        SceneNode* mParent;
};

正如您可能已经猜到的那样,SceneNode表示一个非常简单的树中的节点。我不明白的是SceneNode::attachChild

的实施
void SceneNode::attachChild(std::unique_ptr<SceneNode> child)
{
    child->mParent = this; // How can mParent be accessed? It's private?!
    this->mChildren.push_back(std::move(child));
}

正如您所看到的,该方法会收到一个std::unique_ptr,该SceneNode指向要按价值附加child ,从而声称拥有它。但是,mParent的成员{{1}}仍然是私密的,为什么我们可以访问它?

我觉得有一个令人尴尬的简单解决方案,我无法弄明白,但是......

1 个答案:

答案 0 :(得分:3)

你是对的,这不是C ++ 11特有的。类类型的对象能够访问相同类类型的对象的私有成员。也就是说,成员private是一个类,而不是一个对象。您可以从另一个SceneNode访问SceneNode的私人成员。

为了封装,我们有访问说明符 - 将类的内部实现与使用该类的代码分离。由于类已经知道它自己的内部实现(它的成员函数与其数据成员紧密耦合),因此允许相同类型的对象访问彼此的私有成员时不会丢失封装。