2

マップコンテナを使用してシェイプを保持し、それらのシェイプをID番号に一致させようとしています。

これまで、私は常にSTLコンテナを使用して、オブジェクトを保持およびメモリ管理してきました。だから私はこれらの種類のコンテナを使用します:

std::map<int, Square> squares;
std::map<int, Triangle> triangles;
std::map<int, Circle> circles;

しかし、「Shapes」を保持するための単一のマップが必要です。これは、Square、Triangle、Circleの抽象的な基本クラスです。したがって、これを実現するために、実現可能な派生クラスオブジェクトを独自のマップに格納してから、別のマップを作成します。

std::map<int, Shape*> shapes;

他のマップに保存されているオブジェクトへのポインタを保存します。

ただし、これは非常に厄介なようです。すべてのオブジェクトを、含まれているオブジェクトを所有してメモリ管理する単一のポリモーフィックマップに格納したいと思います。

Boostのptr_mapについて少し読んだ後、これが解決策だと思いました。しかし、基本クラスは、使用しようとしているときのように実現可能である必要があるようです。

boost::ptr_map<int,Shape> shapes;

「エラー:抽象型'Shape'のオブジェクトを割り当てることができません」というエラーが表示されます。

基本クラスを実現可能にする必要がありますか?それはちょっとしたハックになるので、そのような方法があれば、私はむしろこれを適切に行いたいと思います。

これを行う方法についての私の次の最良の推測は、次のようなコンテナを使用することです。

std::map<int, boost::shared_ptr<Shape> > shapes;

これはとても簡単な目的のように思えますが、私はそれがとても難しいので、私がすべきでないことをしようとしているのではないかと思います。ですから、私がどこで間違っているのかについてのアドバイスは大歓迎です。

ありがとう。

4

2 に答える 2

2

ptr_map<int, Shape>道のりのようで、抽象ベースタイプでも機能します(ここの例を参照)。取得するエラーは、の使用に起因すると思いますoperator[]。実際、のようにstd::mapoperator[]キーがまだマップにない場合は、デフォルトで作成された値を返します。この場合、Shapeは抽象であるため値を作成できないため、コンパイラエラーが発生します。

したがってptr_map、インデックス演算子は使用できますが、使用できません。挿入するときは、を使用insertし、キーを検索するときはを使用しますfind

于 2012-05-24T16:02:39.183 に答える
1

基本クラスは実現可能である必要はありません。ここの例を参照してください:http ://www.boost.org/doc/libs/1_49_0/libs/ptr_container/doc/tutorial.html#associative-containers そこの動物には抽象的な機能があります!実際、これはptrコンテナの主な用途の1つです。エラーはおそらく他の場所で発生しているため、さらにコードを投稿する必要があります。

また:

ただし、これは非常に厄介なようです。すべてのオブジェクトを、含まれているオブジェクトを所有してメモリ管理する単一のポリモーフィックマップに格納したいと思います。

そうではないと思います。後で必要になった場合に備えて、実際のオブジェクトのタイプを決して「失う」ことはないことが実際には有益です。たとえば、他のすべての形状ではなく、すべての三角形に対して何かを実行したい場合、これは便利です。

欠点はもちろん、すべてのマップの同期を維持する必要があることですが、これは非常に簡単に解決できます。これらの4つのマップをクラスのプライベートセクションに固定し、3つのオーバーロードを実装します。異なるタイプであり、常にそれらを強く型付けされた「所有」マップとポリモーフィックポインターを使用してマップに挿入します。小さなクラスのインターフェースの背後でそれらを同期させるのは非常に簡単です。何か大きなものの構造化されていない部分としてそれを行おうとしないでください。そうしないと、コードが乱雑に見え始めます。

于 2012-05-24T15:57:48.043 に答える