4

単純なクラスを考えてみましょう:

class SimpleClass {
    int a;
public:
    SimpleClass():a(0){}
    SimpleClass(int n):a(n){}
    // other functions
};

SimpleClass *p1, *p2;

p1 = new SimpleClass[5];

p2 = new SimpleClass(3);

この場合、SimpleClass()p1 の新しく割り当てられたオブジェクトを構築するために既定のコンストラクターが呼び出され、p2 のパラメーター化されたコンストラクターが呼び出されます。私の質問は次のとおりです。配列を割り当て、new 演算子を使用してパラメーター化されたコンストラクターを使用することは可能ですか? たとえば、変数a値がそれぞれ 10、12、15、... のオブジェクトで配列を初期化する場合、new 演算子を使用するときにこれらの値を渡すことは可能ですか?

オブジェクトの配列を処理するには、 stl vector を使用する方が良いことを知っています。new を使用して配列を割り当てることができるかどうかを知りたいです。

4

2 に答える 2

7

placement-newを次のように使用できます。

typedef std::aligned_storage<sizeof(SimpleClass), 
                             std::alignment_of<SimpleClass>::value
                             >::type storage_type;

//first get the aligned uninitialized memory!
SimpleClass *p1 = reinterpret_cast<SimpleClass*>(new storage_type[N]);

//then use placement new to construct the objects
for(size_t i = 0; i < N ; i++)
     new (p1+i) SimpleClass(i * 10);

この例では(i * 10)、 のコンストラクターに渡していSampleClassます。

それが役立つことを願っています。

于 2013-03-11T06:08:09.897 に答える
1

これは1つの方法ですが、値の配列ではなくポインターの配列を作成するため、新しいSimpleClass[5]で実現できるものとは異なります。

SimpleClass *p[] = {
    new SimpleClass(10), 
    new SimpleClass(12), 
    new SimpleClass(15)
};

あなたが望むものを達成するために、私はこれに似たコードをお勧めします:

SimpleClass *p2 = new SimpleClass[3];
SimpleClass *pp = p2;
*pp = 10;
*++pp = 12;
*++pp = 15;

スタック上に一時オブジェクトを作成し、代入演算子を呼び出すため、理想的ではありませんが、コードの観点からはきれいに見えます。ここではパフォーマンスが少し犠牲になります。

于 2013-03-11T06:00:26.563 に答える