• ベストアンサー

実行時型情報を、newの引数にする?

// 各クラスにはoperator=が定義されている class figure{...}; class circle : public figure{...}; class poly : public figure{...}; class rectangle : public poly{...}; ... void copy(figure** src,figure** dst,int n) { // ここでsrcの各項目の指す実体をコピーして、そのアドレスを  // dstに格納したいのですが、 for(int i=0;i<n;++i){ dst[i] = new (ここはどう決めるのでしょうか?) *dst[i] = *src[i]; } } int main() { const int nfig = 10; ... figure* s[nfig]; s[0] = new circle; s[1] = new rectangle; ... .... figure* d[nfig]; copy(s,d,nfig); .... } よろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 operator=でこの状況を乗り切るのは面倒です。  figureクラスに clone()とかの名前の仮想関数を作って、各継承先で実装。 class figure{  virtual figure* clone() = 0; }; class circle : public figure{  virtual circle* clone(){   circle *n = new circle;   *n = *this;   // 要素を1つ1つコピーしてもOK   return n;    // 解放は呼び出し元の責任で  } };  で、使うときは for(int i=0;i<n;++i){  dst[i] = src[i]->clone(); }  どうでしょう?

abcpotato
質問者

お礼

なるほど、そうすればいいんですね。 思いつきませんでした。。。 ありがとうございます。

その他の回答 (1)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

#1さんの意見に同意です。 operator =に固執すると、typeidでswitchするようなことになりかねません。

abcpotato
質問者

お礼

そうですね、typeidでswitchはスマートじゃないですね。 ありがとうございます。

関連するQ&A