我正在编写一个3d资产导入库。 (它使用Assimp,btw)。这是一个包含网格的节点的大场景,每个网格都包含一个材质。所以我创建了下一个类:Scene,Mesh,Material。
只有Scene类应该被编码器实例化并使用,所以最合理的做法是将网格声明为Mesh内部的私有(并且在网格中将Material声明为私有)。
这应该没问题,因为只有Scene才应该使用Mesh,但唯一的问题是它看起来很糟糕,而且我不方便用这种方式编码。 (函数嵌套在类中嵌套的类等...)
我的问题是,是否有其他编码方法可以实现我的目标。
答案 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 ...