2

我正在编写一个游戏框架,并且我正在尝试概括和封装依赖于平台的代码,例如渲染器,以便它更容易移植。我正在尝试实现这一点,同时仍然拥有使用框架的干净方式。我目前遇到静态变量和命名空间的问题......

    // 渲染器.h

    命名空间渲染器
    {
        静态 IRenderer* g_pRenderer = NULL;

        静态 IRenderer* Get(void) { return g_pRenderer; }

        静态 IRenderer* CreateD3DRenderer()
        {
            g_pRenderer = new RendererD3D(); // 派生自 IRenderer
            返回 g_pRenderer;
        }
    }

所以在 my 中main(),我可以调用CreateD3DRenderer()它并返回一个实例就好了;g_pRenderer保持它的值,因为它是在其函数范围内创建和返回的......但是,Renderer::Get()返回NULL. 'static'在其他文件中使用时,从 init of 中删除g_pRenderer会导致冲突。

这是怎么回事?

4

2 回答 2

2

首先,参数列表中的 void 仅在 C 中是必需的。在 C++ 中,您只需编写Get().

至于主要问题,static变量仅限于编译单元。由于您将它们放在标题中,这会导致为包含它的每个编译单元(即每个 cpp 文件)创建一个单独的变量。删除static部件时会出现错误,因为您有多个具有相同名称的变量,从而导致链接错误。

如果要在多个文件之间共享单个变量,请使用extern. 但是,这被认为是不好的做法。你最好重构,所以你不需要这样的全局变量。

于 2013-01-14T05:22:55.747 回答
2

您应该将所有函数定义保存在.cpp文件中,而不是.h

发生的情况是,当以这种方式使用 static 时,函数或变量仅限于该.cpp文件,这意味着g_pRenderer每个.cpp文件中的情况都不同。由于每个定义仅限于一个.cpp文件,因此不会发生多个定义。

您需要将其删除才能使全局指针正常工作。您可以在 getter 函数上保留静态,但我会删除它。您应该将函数和全局变量的定义移动到一个.cpp文件中,并在.h. 将变量声明为extern

于 2013-01-14T05:23:16.170 回答