关于Access Specifier的困惑

问题描述:

我正在看书SFML游戏开发。我明白了,因为在本书中,我将使用SFML API和(更重要的)C++ 11来开发整个游戏。我真的很喜欢通过实际使用它们而不是阅读关于它们的参考风格来介绍所有新功能。关于Access Specifier的困惑

但是,有一小部分代码我真的不明白。 (也许我没有理解甚至没有做与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仍然是私人的,为什么我们可以访问它?

我觉得有一个令人尴尬的简单的解决办法,我无法弄清楚,虽然...

+0

'私人'并不意味着“只能通过这个对象访问”,这意味着“只能访问这个类”。 – Casey

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

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

+0

非常感谢您的快速响应!我学到的第一个OOP语言是Java,其中“私人”成员只能由同一实例/对象内的其他成员访问。只是出于好奇:在C++中,是否有一种方法可以将一个成员private添加到实例/对象? – lambdarookie

+1

@baerenfaenger然后我想你会感到惊讶,[在Java中也是如此](http://ideone.com/aNfygK)。不,没有对象级别的访问说明符。 –

+0

我不敢相信我错过了!再一次非常感谢你! – lambdarookie