5

このようなユーザー定義クラスの配列を作成すると、各要素がデフォルトで構築されます。

S s[5]; // calls default constructor five times, one for each S object

しかし、私のクラスがデフォルトで解釈可能でない場合はどうなるでしょうか? この配列をインスタンス化して後で使用するにはどうすればよいですか?

たとえば、私のクラスSはデフォルトで構成可能ではないかもしれませんが、のような別のコンストラクターがあります。

S(int, int);

デフォルトのコンストラクターではなく、このコンストラクターを呼び出すにはどうすればよいですか?

4

3 に答える 3

6
struct S
{
   const int m;
   S(int p, int k) : m(p) {}
};

S arr[4] = {S(1,1), S(1,2), S(1,3), S(1,4)};

copy-ctor がなくても、次の C++11 リスト初期化を使用できますexplicit

S arr[4] = {{1,1}, {1,2}, {1,3}, {1,4}};

よりスケーラブルなソリューションについては、 または のいずれかを使用できstd::arrayますstd::vector

std::array<S,4> make_array()
{
    // create array... and return
}

std::array<S,4> arr = make_array();
于 2013-05-23T21:22:30.123 に答える
4

を使用して、構築方法決定std::vectorしたオブジェクトで埋めます。

たとえば、C++11 では、emplace_back()メンバー関数を使用して次のように記述できます。

#include <vector>

std::vector<S> v;
v.emplace_back(42, 1729);
v.emplace_back(0, 6);
// ...

あるいは:

std::vector<S> v = { {42, 1729}, {0, 6} };

のコンストラクターがSとしてマークされていない場合explicit。その場合は、次のように記述する必要があります。

std::vector<S> v = { S{42, 1729}, S{0, 6} }.

emplace_back()均一な初期化が存在しなかった C++03 に戻ると、次のようにすることができました。

#include <vector>

std::vector<S> v;
v.push_back(S(42, 1729));
v.push_back(S(0, 6));
// ...

ただし、クラスをコンパイルするには、クラスをコピー可能にする必要があります。

于 2013-05-23T21:21:28.530 に答える