new演算子において一次元配列で引数付きのコンストラクタを呼び出すには?

解決


にょ  2004-08-24 13:03:08  No: 54286

配列で動的オブジェクトの作成をするとき、引数付きのコンストラクタを呼び出す書き方がわかりません。というよりできないのでしょうか?

ちなみにただ単に配列を割り当てる場合
CXXX* test = new CXXX[10];
でできました。

また一方で引数付きのコンストラクタの呼び出し方は
CXXX* test = new CXXX(1);
でできました。

この2つを同時にやりたいのですができますか?できない場合何か代わるやり方はあるのでしょうか?ご教授願います


tetrapod  2004-08-24 16:59:00  No: 54287

C++ の文法構成上、「配列をデフォルト以外初期化」する方法はありません。
デフォルト初期化であれば可能なので、たとえば
CXXX::CXXX(int x=1) { ... }
のようなデフォルト引数つきコンストラクタを用意すれば、配列の new の際には
当該引数つきコンストラクタが呼ばれます。
# が、それが目的の動作かどうかというとちょっとねー。


シャノン  2004-08-24 18:26:46  No: 54288

次善策としては、ポインタの配列を宣言し、その各要素に
引数つきのコンストラクタで得たポインタを入れてやることでしょうか。
もちろん、delete も要素数分必要となりますが。


tetrapod  2004-08-25 04:42:50  No: 54289

どーしてもということなら new[] の代わりに malloc+placement-new で可能。
当然 delete[] の代わりに placement-delete+free となります。
個人的にはそこまでする必要を認めないので、デフォルトコンストラクタを用意し
デフォルトコンストラクト+代入で処理するのがめんどくさくないと思う。


にょ  2004-08-25 06:31:18  No: 54290

色々と書き込みありがとうございます。
ジャノンさんの方法は、
CXXX** p = new CXXX*[10];
for文内で
p[i] = new CXXX(2);
みたいな感じでできました。

tetrapodさんのデフォルトコンストラクト+代入が一番手っ取り早いと思うんですが、ポインタの勉強にもなるためジャノンさんの方でやってみたいと思います。どちらも勉強になりました。ありがとうございます。


tetrapod  2004-08-25 17:50:42  No: 54291

いやだから malloc+placement-new を試してみましょう。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加