2016-04-09 6 views
-1

私はC++を初めて使用しています。メインクラスから継承したC++でオブジェクトの配列を構築するには?

私は、オブジェクトの配列を作成する必要がある、と私は理解したものから、それを使用して行われます。

MyObject* instance = new MyObject[nb_of_instances_in_array]; 

けれども、それは非常に私のニーズに適合していません。

私は主なオブジェクトに3つの異なるオブジェクトを継承しています。

mainObject < - オブジェクト1

mainObject < - Object2に< - オブジェクト3

今私はObject1s、Object2s、およびObject3sを含めることができる配列を作成します。私のような何かをやってみました:

int nb_of_obj, i; 
cin >> nb_of_obj; 
mainObject* arrayOfMainObjects = new mainObject[nb_of_obj]; 
for(i = 0;i<nb_of_obj;i++) 
{ 
//Menu to select Object to append to the array 
arrayOfMainObjects[i] = Object2(args...);\\there are between 3 and 5 args for each object 
} 
delete arrayOfMainObjects; 

私もSTDLIB.Hのmallocとfreeを使用して、よりC指向の方法を試してみました。

*(arrayOfMainObjects + i*max_size()) = Object2(args...); 

の代わり:

arrayOfMainObjects[i] = Object2(args...); 

using namespace std; 

size_t max_size(); 
    return (size_t)(max(max(sizeof(Object1),sizeof(Object2)), max(sizeof(Object3), sizeof(mainObject)))); 

mainObject* arrayOfMainObjects = NULL; 
arrayOfMainObjects = (mainObject*) malloc(nb_of_obj*max_size()); 
//Globally, same code than above 
free(arrayOfMainObjects); 

私は私が間違ってやっているかわからないが、私も同じようなものを、アレイ内の「スポット」の次にアクセスしてやってみました

+0

あなたが試したことで何が間違っているのかを実際に教えてくれるわけではありません(そして、通常は特別なニーズを除いてC++で 'malloc'を使用しません)。 – crashmstr

+0

'std :: vector >'を使うことをお勧めします。 –

+0

@πάνταῥεheもし彼が低いオーバヘッド(この状況では本当に配列を使用する理由のみ)に行くのであれば、 'std :: vector >'を使用するとそれはわずかに遅くなります。 (作成と削除の両方) –

答えて

-1

ただ、それをシンプルに保つ:

class MyObject: public mainObject 
{ 
} 

MyObject* instance = new MyObject[nb_of_instances_in_array]; 

そしてすべてがより簡単になります。

1

次の行がなぜ機能しないのかを見てみましょう。

mainObject* arrayOfMainObjects = new mainObject[nb_of_obj];

arrayOfMainObjectの各要素は、サイズsizeof(mainObject)を有しています。

継承されたオブジェクトに余分なデータが含まれている場合、mainObjectから継承するオブジェクトはmainObjectより大きくなります。 たとえば、sizeof(Object2)>=sizeof(mainObject) // always true!

したがって、配列内に継承されたオブジェクトを構築しようとすると、sizeof(mainObject)のスペースしか残っておらず、残りの部分がスライスされます。

これを修正するには、配列はmainObjectへのポインタで構成することができ、ポインタを継承したオブジェクトの型にキャストできます。

しかし、メモリリークを避けるために、アレイの各ポインタは、使用されなくなったときに解放する必要があります。

スマートポインタを使用して問題のないようにすることができます。 delete arrayOfMainObjectsがまだ必要とされていることを忘れないでください:

std::unique_ptr<mainObject>* arrayOfMainObjects = new std::unique_ptr<mainObject>[nb_of_obj];

EDITような何か。

+0

あなたが言っていることを正しく理解していれば、次のコードがうまくいくはずです: using namespace std; size_t max_size(); return(size_t)(max(sizeof(Object1)、sizeof(Object2))、max(sizeof(Object3)、sizeof(mainObject))))); mainObject * arrayOfMainObjects = NULL; arrayOfMainObjects =(メインオブジェクト*)malloc(nb_of_obj * max_size()); //グローバルに、上記と同じコード free(arrayOfMainObjects); しかし、そうではありません。アレイに複数のオブジェクトを追加しようとすると、プログラムがクラッシュします。 – Dogeek

+0

@Dogeekそれはうまくいくかもしれないと思うが、私は全く間違っている可能性がある。クラッシュが発生した場所でコードを投稿できますか? – jezzi23

関連する問題