2

私はいくつかの C++ 関数を作成しています。これらの関数によって後で処理される場合と処理されない場合があるデータを生成します (ただし、他の場所では処理されません)。これらの関数は、一部の高レベルの GUI 変更の「低レベル」です。

現在、これらの関数を別の名前空間にラップしており、これらのオブジェクトをベクトル内に含める静的 (内部リンク) ベクトルを宣言しています (オブジェクトは構造体として定義され、名前空間にも含まれています)。したがって、一般的な構造は次のとおりです。

namespace Foo
{
    struct Bar
    {
        string data;
    };

    void func1();
    void func2();
    static std::vector<Bar> cachedBars;
}

このためのクラスは本当に必要ありません。また、シングルトンに頼ることにも興味がありません。このソリューションで十分ですか? 具体的には、名前空間スコープのコレクションを内部的にリンクすることは、そのコレクションへのアクセスを制限し、グローバル変数のすべての落とし穴を回避するための最良の方法ですか、それともより良い方法はありますか?

4

2 に答える 2

3

実際には、関数の宣言だけを.hに入れます

void func1();
void func2();

そして、匿名の名前空間の下にある .cpp の隠されたもの。

namespace
{
    struct Bar
    {
        string data;
    };

    static std::vector<Bar> cachedBars;
}

void func1() { /* do something */ }
void func2() { /* do something else */ }

これにより、func1 と func2 はどこからでもアクセスできるようになりますが、Bar と cachedBars は .cpp で定義された関数によってのみアクセスできるようになるため、func1 と func2. .cpp に他に何もなければ、func1 と func2 のみが cachedBars を変更できます。

ご存じないかもしれませんが、匿名の名前空間は、可視性を変更するために static キーワードを使用した場合と同じ効果があります。ただし、ほとんど何でも隠すことができるため、より強力です。

于 2012-05-01T22:44:12.457 に答える
1

Ok。この場合、私が通常行うことは、関数func1()func2()関数を.hファイルに入れることです。静的ベクトルは.cpp関数本体と一緒に内部に入ります。

通常、関数はその構造をパラメーターとして返すか受け取るためstruct Bar、ファイル内を表示する必要があると思います。.hしかし、構造体について誰も知る必要がない場合は、構造体も非表示にし.cppます。(ポインタまたは参照のみが渡される/返される可能性もあります。その後、前方宣言できます。)

于 2012-05-01T22:30:52.960 に答える