2017-03-17 9 views
1

私はオブジェクトのコレクションを持っています。私のソフトウェアで行われた最も重要な操作を登録するQVector<ApplicationStates>と言います。基本的に、このオブジェクトはREDO/UNDO操作を処理するためのものです。アプリケーションは多くの委任オブジェクトを使用して構築されます。登録されなければならない操作は、これらのオブジェクトの多くにあります。そのように、私は常に以下の形式のオブジェクトのコレクションを渡しています。オブジェクトの伝播

class AWidget : public QWidget{ 
    AWidget(QVector<ApplicationStates>* states, QWidget* parent = nullptr); 
    ... 

私は醜いようです。私は2つのソリューションについて考えます:

  • シングルトン;
  • QVectorを静的グローバル変数として宣言するだけです(グローバル変数は悪いと読みました)。

誰かに提案がありますか? あなたの答えをありがとう。

+1

QVector のインスタンスはいくつありますか?ただ1つしか存在せず、参考にして渡す場合は、シングルトンの使用を検討してください。私は静的なグローバルを使用するだけではなく、コードのリエントラントのようなことを防ぎ、複数のスレッドを使用するのが難しくなります。複数のインスタンスがある場合は、それを必要とする関数への引数としてインスタンスを渡すほうがよいでしょう(ただし、ポインタではなく参照によって)。 – Peter

+0

@peterただ1つのインスタンスがあります – Papipone

+0

シングルトンはグローバルと同じ問題のほとんどを持っています。 – aschepler

答えて

2

私は時々同じような状況に陥り、 "ApplicationContext"のようなクラスにベクトルをラップするだけで、共有ポインタや参照を渡してその日を節約することができます。あなたがグローバル/シングルトンを避ける

  • 、あなたが実際にに自由であるあなたは突然、あなたがする必要があるオブジェクトのちょうどそのベクトルが複数ある場合は、将来の
  • 内で同時に複数のインスタンスを持っている:それは多くの利点がありますあなたのコンテキストクラスを拡張して、必要なものを追加するだけです。
  • ベクターが突然地図になるか、または他の方法で変更された場合は、シグナル/スロットなどのインターフェイスを渡す必要はありません。 (もちろん、ベクトルが使用される実装を変更する必要があります)。
  • BONUS:コードは簡単にテスト可能になります!このクラスのテストケースを作成できるようになりました。

これはすべてのケースで最良の解決策ではないかもしれませんが、このケースではかなり近いと思います!