我目前正在阅读 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}}仍然是私密的,为什么我们可以访问它?
我觉得有一个令人尴尬的简单解决方案,我无法弄明白,但是......
答案 0 :(得分:3)
你是对的,这不是C ++ 11特有的。类类型的对象能够访问相同类类型的对象的私有成员。也就是说,成员private
是一个类,而不是一个对象。您可以从另一个SceneNode
访问SceneNode
的私人成员。
为了封装,我们有访问说明符 - 将类的内部实现与使用该类的代码分离。由于类已经知道它自己的内部实现(它的成员函数与其数据成员紧密耦合),因此允许相同类型的对象访问彼此的私有成员时不会丢失封装。