类中的类

时间:2015-03-10 16:05:59

标签: c++

我正在编写一个3d资产导入库。 (它使用Assimp,btw)。这是一个包含网格的节点的大场景,每个网格都包含一个材质。所以我创建了下一个类:Scene,Mesh,Material。

只有Scene类应该被编码器实例化并使用,所以最合理的做法是将网格声明为Mesh内部的私有(并且在网格中将Material声明为私有)。

这应该没问题,因为只有Scene才应该使用Mesh,但唯一的问题是它看起来很糟糕,而且我不方便用这种方式编码。 (函数嵌套在类中嵌套的类等...)

我的问题是,是否有其他编码方法可以实现我的目标。

2 个答案:

答案 0 :(得分:5)

您可以查看pimpl idiom。基本上,只公开客户端应该和可以在公共接口中使用的内容,并保留其他所有内容:

// scene_interface.h
class SceneImpl; //only forward-declare
class Scene
{
    // client-visible methods, and that's all
    // no implementation details
private:
    SceneImpl* pImpl; // <- look, the name
};


// scene_impl.h & scene_impl.cpp
// hidden from the client
class Mesh
{
   //...
};
class SceneImpl
{
   Mesh* pMesh;
   //etc.
};

答案 1 :(得分:3)

您可以在标头(.h)文件中将私有类限制为不完整的声明,然后在实现(.cpp)文件中完全定义它们。

标题Scene.h

class Scene
{
    // ...
private:
    class Node;
    class Mesh;

    Node *node;
    Mesh *mesh;
};

实施Scene.cpp

class Scene::Node
{
    // ...
};

class Scene::Mesh
{
    // ...
};

// definitions of member functions ...