4

私は一般的に C++ と OOP に不慣れで、物事を行うための効率的または「正しい」方法を学ぼうとしていますが、まだ問題があります。

他のクラス/オブジェクトのデータを保持する DataStore クラスを作成しています。このクラスのインスタンス/オブジェクトは 1 つだけです。ただし、オブジェクト/インスタンスはグローバル データであるため、実際には存在する必要はありません。この場合、スコープを提供するための単なる方法のように感じます。そのため、オブジェクトを渡すのではなく、クラス メンバーを直接変更したいと考えています。static と _extern について読んだことがありますが、どちらかが実行可能かどうか、または他のものがより良いかどうかを判断できません。

現在、作成されたオブジェクトを渡してデータを変更していますが、オブジェクトであるという考えを維持しながら、「それ自体のインスタンス」ではなく「それ自体」としてクラスにアクセスしたいと考えています。

4

4 に答える 4

1

プログラムの実行中にほとんどの場合、1 つのインスタンスを持つオブジェクトに対してこれを行います。

class Object {
private:
  Object();
  friend Object & GetObject();

public:
   ...
};

inline Object & GetObject() {
    static Object O;
    return O;
}

1) これは、シングルトンよりも冗長ではありません。
2) これにより、未定義の初期化順序など、グローバル オブジェクトの落とし穴が回避されます。

于 2013-07-05T20:21:25.703 に答える
1

編集: OP のコメントでは、データ ストアは複数のスレッドで実行されるコードによって読み取られ、1 つのスレッドのコードによって更新されると説明されています。私の以前の答えはもはや当てはまりません。これがより良い答えです。

ストアのインスタンスを保持するためにグローバル変数を使用しないでください。これにより、長い間悩まされる可能性のある多くの微妙なバグへの扉が開かれます。読み取りスレッドには、ストアへの読み取り専用アクセスを与える必要があります。書き込みスレッドは読み書きアクセスを取得する必要があります。

データ ストア内の読み取りメソッドが として適切にマークされていることを確認してくださいconst。次に、データ ストアのインスタンスを 1 つ作成し、そのインスタンスへのポインターをconstグローバル変数に入れます。書き込みスレッドには、非 const ポインターを取得する別のメカニズムが必要です ( GetInstance@Mats で提案されているように、public static メソッドを追加します)。

私の以前の回答: データ ストア インスタンスが常に 1 つだけであると確信している場合は、それを渡さないでください。

グローバル変数は嫌われており、一部の言語 (Java および C#) ではグローバル変数を完全に禁止しています。そのため、C# と Java では代わりに静的クラス メンバーを使用しますが、これらは実質的に同じものです (まったく同じ問題があります)。

const単一のインスタンスをグローバル変数に入れることができれば、問題ありません。

なんらかの種類のマルチスレッドを実行している場合は、ストアがスレッドセーフであることを確認する必要があります。そうしないと、本当に悪いことが起こります。

于 2013-07-05T19:53:02.620 に答える