【问题标题】:Class inside a class类内类
【发布时间】:2015-05-12 04:12:01
【问题描述】:

我正在编写一个 3d 资产导入库。 (它使用Assimp,顺便说一句)。有一个包含网格的节点的大场景,每个网格都包含一个材质。所以我创建了下一个类:场景、网格、材质。

只有 Scene 类应该被编码器实例化和使用,因此最合理的做法 (imo) 是将 Mesh 声明为 Scene 内部的私有(并且 Material 也声明为 Mesh 内部的私有)。

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

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

【问题讨论】:

  • 我一般不是friends 的粉丝,但您可以将Mesh 构造函数设为私有并将Scene 设为friend,以便允许实例化Mesh
  • 如果只能实例化Scene,您如何建议创建Mesh 以添加到Scene,或创建Material 以添加到Mesh,而不实例化MeshMaterial 或两者兼而有之? Scene 拥有一些类似容器的方法可能会更好,并允许 MeshMaterial 根据需要被实例化并酌情添加到 Scene...
  • @twalberg 场景得到了一个导入文件。它的职责是将所有 3d 内容放入内存中,并使用 Mesh 和 Material 来做到这一点。用户不应该关心网格和材质。

标签: c++


【解决方案1】:

您可以查看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.
};

【讨论】:

    【解决方案2】:

    您可以将私有类限制为头文件 (.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 ...
    

    【讨论】:

    • 用户仍然可以实例化新的节点和网格。这对我没有帮助
    • @Pilpel:不,用户将无法实例化Nodes 和Meshes。他将只能声明指向它们的指针。如果您甚至不想这样,您可以在Sceneprivate 部分中声明类,然后在实现文件中为定义添加前缀Scene::
    • @Pilpel:我已经修改了答案以反映这一点。
    • 为什么不编译 this:pastebin.com/vSa5t22v?我得到的错误记录在代码下方
    • @Pilpel:因为InBase 的构造函数是在实现文件中定义的,并且在您定义Base 构造函数的标头中不可用。您还需要在实现文件中定义Base 构造函数,而不是在标题中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2017-05-15
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多