1

トピックを混乱させて申し訳ありませんが、これは元の質問でした:

実際に異なる派生クラスを指している、基本クラスへのポインターの配列を再割り当てする方法は?

可能であれば、ここで動的キャスト、typeid、または RTTI を使用しないでください。

編集配列要素を保存して、新しい配列のポインターを古い要素に設定するだけでよいことに気付きました..しかし、operator =またはCctorを実行するにはどうすればよいですか?

または:

実際に要素をコピーして、この配列を「悪い方法」で再割り当てする方法は?

例:

class Base {...}
class Derived1 : public Base {...}
class Derived2 : public Base {...}

int main()
{
  int arrayLength=0, arrayMaxLength=3;

  Base **array=new Base*[arrayMaxlength];
  array[0]=new Derived1();
  array[1]=new Derived2();

  //Reallocation starts...
  Base **tmp=new Base*[arrayMaxLength*=2];

  for(int i=0;i<arrayLength;i++)
    tmp[i]=new Base(*array[i]);      //<------ What to put here instead of Base?


  //The unimportant rest of Reallocation..
  for(int i=0;i<arrayLength;i++)
    delete array[i];
  delete [] array;
  array=tmp;
}
4

1 に答える 1

1

キャスト (動的またはその他) を行う必要はありません。ポインターを再利用するだけです。

Base **array=new Base*[arrayMaxlength]; 
array[0]=new Derived1(); 
array[1]=new Derived2(); 

//Reallocation starts... 
Base **tmp=new Base*[arrayMaxLength*=2]; 

for(int i=0;i<arrayLength;i++) 
  tmp[i]=array[i]; 

// ...

オブジェクトは既に割り当てられており、適切な型を持っています。ポインター自体を新しい配列にコピーするだけです。

古い配列のポインター (が指すオブジェクト) に注意する必要があることに注意してくださいdelete。新しい配列のポインターが無効になるためです (格納されたポインターが指すオブジェクトはもう存在しません) --元の配列自体を削除するだけです。

ポインタの管理が面倒になる場合は、ある種の共有ポインタを使用できます (たとえば、BOOST ライブラリにはさまざまな種類があります)。

于 2012-04-14T12:36:45.847 に答える