关于访问说明符的困惑

Confusion about Access Specifier

本文关键字:说明符 访问 于访问      更新时间:2023-10-16

我目前正在阅读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仍然是私有的,为什么我们可以访问它?

我觉得有一个令人尴尬的简单解决方案,不过我无法弄清楚......

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

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