1

operator を呼び出す 5 つのクラスがあります。

 * Enter(x)
 * Exit(x)
 * Push(b,x,y)
 * TurnOn(x)
 * TurnOff(x)

Predicates と呼ばれるさらに 3 つのクラスがあります。

 * At(x,y) - example : At(Robot,Room3) , At(Box1,Room1) , At(Box3,Corridor)
 * SwithOn(x) - SwitchOn(Room2)
 * SwitchOff(x) - SwitchOff(Room1) , SwitchOff(Room4)

そして、それらを保存するための優れたデータ構造が必要です。

最初に、2 つの基本クラスを作成し、継承を使用しました。

  • 、 およびPredicateのクラスAt(x,y)SwithOn(x)SwitchOff(x)

  • 、、、、、のクラス。Operator_ Enter(x)_ Exit(x)_Push(b,x,y)TurnOn(x)TurnOff(x)

そして、次の 2 つの deques を追加しました。

std::deque<Operator> operators;
std::deque<Predicate> predicates;

そして、たとえばExit演算子を作成すると:

Exit myExit ;

それを両端キューにプッシュします。

operators.push_back(myExit); // this works fine 

しかし、operatorsdeuqe から何らかの要素を抽出しようとすると、何らかのキャストを使用する必要があります。

  1. 複数の (異なるタイプの) オブジェクトを格納できるデータ構造を持つことは可能ですか?

  2. まだ計画段階ですが、要素の抽出に問題がないように、他の種類のデザインを提案できますか? 私が考えることができる最善のことは、ポリモーフィズムです...

よろしく

4

2 に答える 2

2

特定の要件については、Operator をポリモーフィックにし、データを ptr_vector のようなブースト ポインター コンテナーに格納することを検討します。結局のところ、さまざまな特定の操作がすべて演算子であるという共通点を持っていることは理にかなっています。

基本的な std::deque<> を使用した現在の実装は、基本クラスのみを格納しているため、オブジェクトのスライスにつながるため、機能しません。ポリモーフィズムが必要なこの特定のケースでは、代わりにオブジェクトへのポインタを格納できる必要があります。あなたの場合、おそらく

boost::ptr_vector<Operator> something;

ブーストを使用できない場合、他のオプションは、std::shared_ptr のような標準コンテナーを使用することです。たとえば、次のようになります。

std::deque<std::shared_ptr<Operator> > something;

生のポインターを std::vector に保存したくない場合、簡単に回避できるあらゆる種類の興味深いライフタイム管理の問題が発生するためです。

于 2012-12-17T03:24:23.053 に答える
1

複数のオブジェクトを格納できるデータ構造を持つことは可能ですか?

はい、それはStructureと呼ばれます。一度に 1 つの型だけを保存する場合は、 を使用してVariantunionを作成します。どちらも、あなたが説明したことについては良い考えではありません。

私はまだ計画の段階ですが、要素の抽出に問題がないように、他の種類のデザインを提案できますか? 私が考えることができる最善のことは、ポリモーフィズムです...

ポリモーフィズムが必要なように思えます。キャストを使用して、あるタイプを基本タイプから別のタイプに変換することはできません。できますが、データが失われます。現在、サブクラスを基本クラスに効果的にキャストしてから、値によってdeque.

ポリモーフィズムを利用するには、ポインター (Opererator*またはPredicate*) を両端キューに格納する (または を使用するstd::auto_ptr) だけです。

于 2012-12-17T03:25:17.547 に答える