0

ここに問題があります。次のような派生オブジェクトで満たされた抽象基本クラスへのポインターのベクトルがあります。

class AbstractBase { /* ... */ };  

clase Derived1 : public AbstractBase {
    Derived1() { }
    Derived1( const AbstractBase& abc ) { /* ... */ }
};

/* ... */

vector< AbstratcBase* > lThingies;

const AbstractBase& getThingie(int pos) {
    return *lThingies[pos];
}

要素のコピーを取得するには、次のように派生クラスの「コピー コンストラクター」を使用します。

Derived1 d1 = getThingie(2);

しかし、問題は私がこれを好きではないということです: クラス「built42」を構築するときに、この「コピー コンストラクター」の実装を強制する方法はありません。再帰呼び出し、私に起こりました)。

私の質問は次のとおり です。これを行うためのより良い方法はありますか? どうやって?

更新:
私が探しているソリューションの「書かれていない」要件の 1 つは、派生オブジェクトのコピーをローカル変数として取得することです。そのため、削除することを忘れません。

詳細情報:
多数のlThingiesがあり、実行時に含まれる派生オブジェクト (派生 1、派生 2 など) が何であるかを知ることができますが、コンパイル時にはわかりません。

4

3 に答える 3

4

ポインタを返す純粋仮想clone関数を作成し、派生クラスでオーバーライドすることができます。AbstractBaseAbstractBaseclone


厳密な意見:

しかし、これは(私の意見では)ひどく時代遅れの慣習のようなものです。そもそもこれを行う必要をなくすために、再設計することをお勧めします。

仮想コンストラクターのイディオムについての私の「大きくて時代遅れの」意見について詳しく説明すると(これは物議を醸すと確信しています):

  • 一部のSTL構造のように、実際に堅牢で一般的なクローンを作成するには、アロケータ用にテンプレート化する必要があります。しかし、それはできません。
  • 具体的なタイプがわからないオブジェクトを実際にコピーしたいのはいつですか。そのユースケースの正当性に疑問を投げかけます。
于 2013-01-17T16:07:03.617 に答える
0

あなたのgetThingieリターンを知っていますDerived1か?これがわかっている場合は、 の戻り値の型Derived1と のストレージを のstd::vector代わりDerived1に変更する必要がありますAbstractBase

上記がうまくいかないと仮定するとDerived1 bob = dynamic_cast<Derived1&>(getThingie(...));、それが実行時チェックを行い、それが 1Derived1つ以上の派生インスタンスであることを確認し、そうであればキャストを実行し、そうでなければ例外をスローします。

であることが確実であるために実行時チェックに煩わされたくない場合はDerived1、単純に を使用してDerived1 bob = static_cast<Derived1&>(getThingy(...));ください。

ただし、継承階層を持つクラスの実際のインスタンスを操作することは非常に疑わしいものです。うまくいかないことがたくさんあります。

于 2013-01-17T16:29:16.943 に答える