4

私は、物理シミュレーションでキャラクターを駆動する非常に広範なフレームワークを作成しました。誰もがそうしないように私に警告しましたが、私は情報の保存にグローバルな公開データ構造を使用し、それを State と呼びました。名前空間にもありません。extern State state; を宣言することで、グローバルにアクセスできるようにします。私がこれを行った理由は、この構造がアプリケーションのあらゆる場所で必要であり、State.h をインクルードするだけで、どこでも state.var に書き込み、どこでも state.var を読み取ることが非常に便利だと思うからです。フレームワークも急速に変化しており、新しいコンポーネントが導入されたときにデータの受け渡しや同期などを気にする必要がないことも快適です。

とにかく、今度は s*** がファンに当たりました。Qt の GUI クラスの 1 つを使用したいのですが、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;
    };
}

…が、技術的負債というものもあり、深くお借りしています。

于 2012-11-10T14:22:31.553 に答える