4

ポインターを使用してクラス オブジェクトの配列を初期化するプログラムがあります。

class xyz{};
cin>>M;

xyz *a=new xyz[M];   //this will call the constructor for each object.

問題は、クラス xyz に 2 つのコンストラクターがあることです。引数のないデフォルトのコンストラクターではなく、他のコンストラクターを使用して最後の 2 つの要素を初期化したい。これどうやってするの?

M+1 番目と M+2 番目の項を、引数を受け取る別のコンストラクターで初期化する必要があります。

4

2 に答える 2

4
std::vector<xyz> a(M-2);
a.push_back(xyz(...));     // xyz(...) here is a call to the
a.push_back(xyz(...));     // constructor you want to use

このコードは、M >= 2 であると仮定しています。もちろん、これは安全な仮定ではなく、準拠していないケースをどのように処理するかを決定する必要があります。

于 2013-09-18T20:25:05.563 に答える
2

まず、cin<<M間違っています。である必要がありますcin >> M。挿入演算子と抽出演算子が正しい方向を指していることを確認してください。

単一の間接化ではできません。newオペレーターは、配列内の各オブジェクトのデフォルト コンストラクターを呼び出します。

目標を達成するためのオプションは次のとおりです。目的の割り当てに必要なデフォルト値をコピーするか、オブジェクトへのポインターの配列を作成します。

コピー方法

xyz t(my_other_constructor);
xyz* a = new xyz[M];
a[M - 1] = t; // overwrite the default constructed value with the desired

二重間接参照

xyz** a = new xyz*[M];
for (int i = 0; i < M - 1; ++i)
{
    a[i] = new xyz;
}
a[M - 1] = new xyz(my_other_constructor);

std::vectorただし、手動配列を作成する代わりに使用するのが理想的です。

于 2013-09-18T20:31:40.903 に答える