2017-11-29 7 views
0

クラス車両のインスタンス番号をインスタンス化していると仮定できます。車両オブジェクトが何らかの理由(例えば最も近い車両を見つける)で他の既存の車両を照会したい場合、クラスは以下のコードのように静的メンバーおよびメソッドを通じてインスタンス化されたオブジェクトを管理すべきですか?これは良いデザインパターンですか?これは共通の基準ですか?私がこのアプローチをとると落とし穴はありますか?クラスはインスタンス化されたオブジェクトを管理する必要がありますか?

#include <vector> 
    #include<algorithm> 

    struct Location { 

    double x, y, z; 

    Location(double xx, double yy, double zz) : x(xx), y(yy), z(zz) {} 

    }; 

    class Vehicle { 
    private: 

     Location l; 

    public: 

     Vehicle (Location ll) : l(ll) { 

      vv.push_back(this); 

     } 

     static std::vector<Vehicle*> vv; 

     ~Vehicle() { 
      std::vector<Vehicle*>::iterator it; 

      // removing the Vehicle object from the list of existing vehicles 

      for (it = vv.begin(); it != vv.end(); it++){ 

       if (*it == this) { 

        vv.erase(std::remove(vv.begin(), vv.end(), this), vv.end()); 

       } 

      } 

     } 

     Vehicle& find_nearest_vehicle() { 

      // code to iterate through list of existing vehicles and find the nearest vehicle  

     } 


    }; 

    static std::vector<Vehicle*> vv; 
+1

余分な空白行をすべて削除して、それほどスクロールする必要はありません。 – mkrieger1

+0

これはアプローチであり、時には正しいアプローチです。私たちはあなたがこれをどのように使用するのかを見なければなりません。しかし... ... 'vv.push_back(これ);'は痛みを引き起こす可能性があります。自動割り当てと動的割り当ての両方を 'vv'に追加することができます。誰がこのリストを掃除する責任があり、範囲外になる自動割り当てをどのように管理する予定ですか?作成して追加する工場を考えてみましょう。あなたがそのルートに行くなら、なぜマネージャークラスではないでしょうか? – user4581301

+0

これは、プログラムに車両のマスターセットが1つだけ存在するように強制します。それは少し制限があるようです。また、内部の静的なものに加えて他の外部のセットを* *持つこともできますが、それは私に重複しているようです。私はこのデザインが非常に具体的で、おそらくあいまいなニーズに合っていると思うだろう。 – Galik

答えて

4

は、例として使用される一般的なオブジェクト指向のシナリオのいずれかにそれを置く:

  • 動物は、他のすべての動物を知っていますか?
  • 車は他のすべての車について知っていますか?
  • 色は他のすべての色を知っていますか?

あなたが求めているのは、実際の意見に基づいていますが、ほとんどの人が「いいえ」と言っていると思います。いくつかの種類のマネージャクラスを使用してインスタンスを制御します。

あなたのケースでは、私はそれが場所を知っているVehicleと、すべてのVehicleについて知っているVehicleManagerを持っています。あなたがどのような色の車両を知りたければ、車両に尋ねます。赤い車がどこにあるのか知りたければ、VehicleManagerに尋ねます。

あなたのソリューションには、車両の静的な集まりに依存する車両/車両マネージャの組み合わせがあります。記述したように2つのクラスを使用する場合、複数のセットを持つことができます。例えば異なる企業やトラックの車と車などとの違いも確かにありますが、あなたのソリューションはあなたをロックします.2つのクラスを使用する方がはるかに柔軟です。

あなたの最後のコメントに答えてください:do you think it's ok or is it a terrible design? - これはひどいデザインです。

+0

マネージャークラスはコードの臭いではありませんか? –

+0

私はクラスがそのオブジェクト自体を管理しているか、これが外部のマネージャクラスの責任であるべきかどうかという点で、より良い質問があると思いますか?どちらが読みやすくてきれいなコードですか?私の頭に浮かべるもう一つの関連する質問は、クラスやマネージャーのクラスが、オーバーヘッドを避けるために一時的なオブジェクトのためにその参照が保存されていないことを確認する方法はありますか? – Arash

+1

@ manni66問題は概念よりも名前が多いです。名前を付けてスコープをきつくして、あなたは大丈夫です。リンクされたリストではなくノードマネージャとは何ですか? – user4581301

関連する問題