C ++全局结构会产生名称冲突

时间:2012-11-10 13:37:17

标签: c++ conflict naming

我编写了一个非常广泛的框架,可以在物理模拟中驱动角色。即使每个人都警告我不要这样做,我使用全球公共数据结构来存储信息,并称之为State。它也不在命名空间中。我通过声明外部状态来使全局可访问;我这样做的原因是因为在应用程序的任何地方都需要这个结构,我发现只包含我的State.h非常方便,然后在任何地方写入state.var并在任何地方读取state.var。框架也在快速变化,我也感到很舒服,在引入新组件时不必关心传递数据,同步等。

无论如何,现在s ***击中了粉丝。我想使用Qt的GUI类之一,它已经拥有了自己的成员状态State状态。它们的状态至少在命名空间中,但它似乎并不重要,因为在类中我已经在使用该命名空间。

我现在能做什么?

3 个答案:

答案 0 :(得分:6)

你唯一的选择是撕掉你的全局并用理智的东西取而代之。这是非常痛苦的,但你真的没有任何其他选择。这就是为什么人们建议不要首先使用一个。

简而言之,祝贺学习手头的课程 - 不要使用全局变量。

答案 1 :(得分:5)

我可能不明白这个问题,但是阻止你做什么

::state.var

普通::表示全局命名空间,虽然使用全局符号有众所周知的问题,而全局变量也有各自的问题(通常用C ++代码代替单例),没有什么神奇的恶魔关于在全局命名空间中使用全局变量。 ::errno是这样一个变量的例子,它与几乎所有类似Unix的平台上的C和C ++应用程序相关联。

答案 2 :(得分:2)

嗯,有一个简单的选择:

extern State state;
State& mystate = state;

namespace qt {
    class State;

    class Gui {
    public:
        void foo() {
            mystate.var = 3;
        }

    private:
        State* state;
    };
}

...但也有一些名为Technical Debt的东西,你正在深深借用。