4

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

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

我现在能做什么?

4

3 回答 3

6

你唯一的选择是撕掉你的全局并用理智的东西代替它。这是非常痛苦的,但你真的别无选择。这就是为什么人们首先建议不要使用一个。

简而言之,恭喜你学到了手头的课程——不要使用全局变量。

于 2012-11-10T13:43:29.577 回答
5

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

::state.var

?

Plain::表示全局命名空间,虽然使用全局符号有众所周知的问题,并且全局变量也有自己的一组问题(通常在 C++ 代码中,使用单例代替),但在全局中使用全局变量并没有什么神奇的坏处命名空间。::errno是与类 Unix 平台上几乎所有 C 和 C++ 应用程序相关联的此类变量的示例。

于 2012-11-10T17:21:06.907 回答
2

好吧,有一个简单的替代方案:

extern State state;
State& mystate = state;

namespace qt {
    class State;

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

    private:
        State* state;
    };
}

...但也有一种叫做Technical Debt的东西,你正在借钱。

于 2012-11-10T14:22:31.553 回答