まず、基本的な構成を考えます。新しいTestClass
を作成し、その初期値をオンザフライで指定したいと思うように思えます。
/**
* TestClass.hpp
*/
class TestClass
{
public:
int a;
int b;
TestClass(int aInitial, int bInitial);
};
/**
* TestClass.cpp
*/
TestClass::TestClass(int aInitial, int bInitial)
: a(aInitial),
b(bInitial)
{
}
// ... which is the same as...
TestClass::TestClass(int aInitial, int bInitial)
{
this->a = aInitial;
this->b = bInitial;
}
/**
* SomewhereElse.cpp
*/
...
TestClass foobar(1, 2);
std::cout << foobar.a << std::endl; // 1
std::cout << foobar.b << std::endl; // 2
...
をしかし、あなたはすでにそれを考慮し、あなたが実際にがは、リストの初期化を使用する必要がありますと仮定してみましょう:
あなたは、コンストラクタを使用してこれを行うことができます。答えは実際にはpage you mentioned,に展開しましょう。
カスタムクラスでこのような何かを書きたい...
TestClass foobar = { 1, 2 };
これは、最初のいくつかの手動の作業が必要です。最初のメンバーに0番目のインデックスを割り当て、2番目のメンバーに1番目のインデックスを自動的に割り当てる魔法はありません。
コンパイラはstd::initializer_listを受け入れる代入演算子やコンストラクタが必要です。
/**
* TestClass.hpp
*/
class TestClass
{
public:
int a;
int b;
TestClass(std::initializer_list<int> list);
};
/**
* TestClass.cpp
*/
TestClass::TestClass(std::initializer_list<int> list)
{
if (list.size() != 2) {
// Throw an error or set some defaults
}
int i = 0;
for (int value : list) {
if (i == 0) {
this->a = value;
} else {
this->b = value;
}
i++;
}
}
これは、あなたがそれを行うことを期待しているものを行います。しかし、そのコンストラクタはかなりファンキーですね。 std::initializer_list
はその値にインデックスされたアクセスを提供していないので(換言すればlist[0]
またはlist[1]
はできません)、奇妙なfor
ループを実行する必要があります。
std::vector
(またはstd::array
,std::list
などの別の種類のコンテナなど)をコンストラクタに受け入れることで、これを読みやすくすることができます。 std::initializer_list
がこれら容器にコンストラクタとして受け入れられているので、
これは動作し、暗黙の型変換を行うことができます。
/**
* TestClass.hpp
*/
class TestClass
{
int a;
int b;
TestClass(std::vector<int> values);
};
/**
* TestClass.cpp
*/
TestClass::TestClass(std::vector<int> values)
{
if (values.size() != 2) {
// Throw an error or set some defaults
}
this->a = values[0];
this->b = values[1];
}
構造体、クラス、同じことを。 – juanchopanza
C + +のクラスと構造体の唯一の市長の違いは、クラスがプライベートを使用し、構造体はパブリックメンバーアクセスをデフォルトで使用することです。 – Tracer
"リストでオブジェクトを初期化する"とはどういう意味かわかりません。 std :: listオブジェクトを意味しますか?あなたの質問がオブジェクトを初期化する方法であれば、あなたの例で 'TestClass obj(1,2);'を使ってスタック上にオブジェクトを作成することができます。ヒープ上に作成したい場合は、 'TestClass * obj = new TestClass(1,2);'を使うことができます。オブジェクトの使用が終了したら 'delete obj;'を忘れないでください。 – wuppie367