2

私はこれらのステートメント、より具体的にはMyDoubleオブジェクトの配列宣言と通常のMyDoubleオブジェクトの初期化を持っています:

MyDouble D[8]; //Creating 8 'MyDouble' objects (created with default constructor)
MyDouble t;

主な目標は、MyDouble tではなく、配列Dで作成されたMyDoubleオブジェクトに対して別のコンストラクターを呼び出したいことです。上記のステートメントは変更できません。

私の質問は、C++が現在自動的に行う初期化プロセスに入ることができるかどうかです。MyDoubleクラスにある種の関数(オーバーロードoperator[]など)を配置することで、この初期化プロセスをオーバーロードできますか?

私はこれが不可能だと思います、私はこれについていくつかのフィードバックが欲しかっただけです。十分に説明できたと思います。

4

4 に答える 4

3

いいえ、できません。(あなたの拘束を考慮して)

于 2012-10-24T15:25:41.053 に答える
2

8.5p6から、

タイプのオブジェクトをデフォルトで初期化Tするとは、次のことを意味します。 [...] — T が配列タイプの場合、各要素はデフォルトで初期化されます。[...]

したがって、配列要素で実行される初期化は、単独のオブジェクトで実行される初期化と同じです。

于 2012-10-24T15:28:08.137 に答える
1

次のように、配列で別のコンストラクターを呼び出す方法があります。

MyDouble D[8] = {
    MyDouble( 1 ),     // Create from an int
    MyDouble( "2.0" ), // Create it from an string
    MyDouble( 1.35 ),  // Create from a double
    // rest of the items will be initialized using default constructor
};

しかし、目的が配列ごとに異なるコンストラクターを呼び出すことである場合、結果はノーです!

MyDouble {
    MyDouble( /* I have nothing to put here to make this the choice for arrays */ );
}
于 2012-10-24T16:13:40.533 に答える
0

std::vector単純な配列の代わりに使用できます。custom を使用して配列要素の作成プロセスを制御できますallocator。単純なケースでは、指定された要素からすべての要素をコピーして構築できます。

struct C
{
    C() { std::cout << "Constructed\n";}
    C(const C&) {std::cout << "Copy constructed\n";}
};

int main()
{
    std::vector<C> a(8, C()); //al elements are copy constructed
}
于 2012-10-24T15:36:04.617 に答える