0

私は2つの独立したクラス階層を持っていますBaseClass1BaseClass2

これが私がやりたいことです:

struct BaseClass1 {
  virtual void obtain_map(std::map<int,BaseClass2> &map) = 0;
}

のサブクラスは。をBaseClass1オーバーライドしますobtain_map。ただし、問題は、これらのサブクラスがパラメーターBaseClass2でのサブクラスを使用できる必要があることです。map(したがって、この意味で、2つの「独立した」階層のサブクラスは実際に関連している、またはサブクラスの設計者が望む場合は関連している可能性があります)

どうすればこれを達成できますか、または自分のmapクラスを最初から作成する必要がありますか?

4

2 に答える 2

1

このようにクラスを派生させ、2番目のmapテンプレートパラメーターとしてポインターを使用する場合(のようなスマートポインターを使用std::unique_ptrすると、メモリ管理の問題を軽減できます)。

struct BaseClass1 {
    virtual void obtain_map(std::map<int, std::unique_ptr<BaseClass2>> &map) = 0;
};
struct DerivedClass1 : public BaseClass1 {
    virtual void obtain_map(std::map<int, std::unique_ptr<BaseClass2>> &map) override
    {
    }
};

maps2番目のタイプとしてBaseClass2の派生バージョンを引き続き渡すことができます。

struct DerivedClass2 : public BaseClass2;
// ...

std::map<int, std::unique<DerivedClass2>> mdc2;
DerivedClass1 dc1;
dc1.obtain_map(mdc2);
于 2013-02-09T00:06:59.417 に答える
0

STLコンテナは、固定サイズのオブジェクトのみを格納します。BaseClass2派生クラスオブジェクトをにプッシュするとstd::map<int,BaseClass2>、オブジェクトはBaseClass2タイプにスライスされます。

std::mapBaseClass2のサブクラスを格納したい場合は、ポインタ(スマートポインタ)をマップに格納する必要があります。

例えば:

  struct BaseClass1 {
    virtual void obtain_map(std::map<int, std::unique_ptr<BaseClass2>> &map) = 0;
  }

   struct DerivedClass1 : public BaseClass1 {
   virtual void obtain_map(std::map<int, std::unique_ptr<BaseClass2>> &map)
   {
      // implementation
   }
 }

smpartポインターの保管は、ポインターが指しているメモリーを手動で削除する必要がないため、rawpoiterと比較して進歩しています。

于 2013-02-09T00:05:12.647 に答える