gpt4 book ai didi

c++ 命名空间和类层次结构

转载 作者:太空狗 更新时间:2023-10-29 21:24:22 25 4
gpt4 key购买 nike

这个问题困扰了我一段时间,但找不到最好的解决方法。我试图通过一个例子来说明这一点。

我正在开发一个包含许多类的图形库。一些类彼此之间是“一部分”关系,例如这 3 个类:

namespace MyGraphicsLibrary
{

class MatrixStack
{

};

class Transform
{
MatrixStack mMatrixStack;
};

class Renderer
{
Transform mTransform;
};

}

Renderer 类供用户使用,但我不希望他们在查找 TransformMatrixStack 类时看到 我的图形库。最后两个类仅供Renderer类使用,不供用户使用。

这里我想做两件事:

  1. 对用户隐藏 TransformMatrixStack 类。

  2. 反射(reflect)类的“部分”层次结构。

我尝试了以下方法来解决这个问题:

  1. 对我来说最好的解决方案是私有(private)嵌套类,因为它会向用户表明嵌套类是私有(private)的,并且如果您只查看 Renderer 也会反射(reflect)层次结构类声明。以下帖子实际上让我不确定这是一个好的解决方案:Pros and cons of using nested C++ classes and enumerations?

  2. 我试图将TransformMatrixStack 放入另一个名为Private 的命名空间中。因此,查找 MyGraphicsLibrary 命名空间的用户会看到 Private 命名空间,它仅涵盖所有不供用户使用的类。这很好,但是有很多其他类也有同样的问题,我很快用彼此无关的类填充了 Private 命名空间。在这里我只能想出丑陋的解决方案,比如引入嵌套命名空间:

    namespace MyGraphicsLibrary
    {
    //private classes belonging to Renderer class
    namespace PrivateRenderer
    {
    class MatrixStack
    {
    };

    class Transform
    {
    MatrixStack mMatrixStack;
    };
    }

    //public classes for users
    class Renderer
    {
    Transform mTransform;
    };
    }

也许我在这里漏掉了一些东西,但你认为哪一个是正确的选择。有人有第三种方法吗?

最佳答案

您可以使用 PIMPL-(也称为不透明指针)习惯用法。使用帽子,您可以通过以下方式完全隐藏用户的类:

在您的公共(public) header 中(在您的包含文件夹中):渲染器.h

class RendererImpl; // forward declaration of internal render structure

//public classes for users
class Renderer
{
public:
Renderer();
~Renderer();
// public interface comes here and delegates all calls to RendererImpl (have to be implemented in cpp)

RendererImpl* renderer; // better use something like QScopedPointer here
};

中央人民政府:

#include "RendererImpl.h" // your actual renderer that 

Renderer::Renderer()
:renderer(new RendererImpl)
{}
Renderer::~Renderer()
{
delete renderer;
}

这些实现可能对 API 完全隐藏。 header 必须与实际接口(interface)分开。

关于c++ 命名空间和类层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16384757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com