2017-06-28 9 views
2

申し訳ありませんが、これは基本的な質問ですが、私は答えを見つけることができませんでした。私の質問は、リストを使用してオブジェクトを初期化する方法に関するドキュメントを見つけることができる場所です。次のように?C++でlistを使ってオブジェクトを初期化する方法は?

class TestClass { 
public: 
    int a; 
    int b; 
}; 

その後、オブジェクトを初期化:

TestClass obj = TestClass{ 1, 2}; 
    cout << obj.a << " " << obj.b << endl; 

私はthisページを発見。

(2)のようですが、ルールは何も言及されていません。たとえば、a、b、...は公開されている必要がありますか?私はそれが動作しない後に私はint cを追加してみました。構造体については、私の質問はクラスについてです。

おかげ

+9

構造体、クラス、同じことを。 – juanchopanza

+0

C + +のクラスと構造体の唯一の市長の違いは、クラスがプライベートを使用し、構造体はパブリックメンバーアクセスをデフォルトで使用することです。 – Tracer

+0

"リストでオブジェクトを初期化する"とはどういう意味かわかりません。 std :: listオブジェクトを意味しますか?あなたの質問がオブジェクトを初期化する方法であれば、あなたの例で 'TestClass obj(1,2);'を使ってスタック上にオブジェクトを作成することができます。ヒープ上に作成したい場合は、 'TestClass * obj = new TestClass(1,2);'を使うことができます。オブジェクトの使用が終了したら 'delete obj;'を忘れないでください。 – wuppie367

答えて

0

それでは、私が見つけたことは、あなたがいる限りそのことが「集約」であるとして、C++でそのスタイルで何かを初期化することができるということです。今すぐ!集合体とは何ですか? C++の標準規格であるC++ 11、C++ 14などに依存しています。これはC++11 aggregate initialization for classes with non-static member initializersの答えで雄弁に議論されています。私はこれが本当に役立つことを本当に望む

0

まず、基本的な構成を考えます。新しい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]; 
} 
+1

これは必要ありません。元のポストのコードは、コンストラクタがまったくなくてもうまくコンパイルされます。 – aschepler

+0

すばらしい答えをありがとう! – PYA

関連する問題