2016-10-15 9 views
2

この質問は、すべてのデータメンバをパラメータとして受け取り、それらを初期化するコンストラクタがあるC++の古いデータ定義に関するものです。拡張されたイニシャライザリストの上にあるこの唯一の理由は、構造の一部を指定するだけのエラーを防ぐためです。すべての構造体メンバを初期化する

struct Struct { 
    A a; 
    B b; 
    C c; 
    Struct(A a, B b, C c) : a(a) , b(b), c(c) {} 
}; 

それは、各メンバーの種類が二度書かれていることを観察する価値がある、と名前を4回:

はここで、このような構造体を書くための一般的な方法です。実際には、このような構造体のコードはむしろ圧縮可能であることを意味します。この構造体をC++で記述する方法はありますか?

+0

C++はかなり冗長で、ないと思います。一つの注意点:以前の '()'初期化よりも一様な初期化が好まれるので(例えば、 'a {a}、b {b}、c {c}')使用するべきです([この質問](https://プログラマ.stackexchange.com/questions/133688/is-c11-uniform-initialization-a-replacement-for-the-old-style-syntax)) – Majora320

+0

このクラスはPlain Old Dataクラスではありません。デフォルトのコンストラクタです。 'Struct()= default;'を追加する必要があります。 –

答えて

0

興味深い質問。私はそれを書くための短い方法はないと思います、特にここではほとんどの名前が1文字です;)

一般に、C++の型定義は高度に反復する傾向があります。たとえば、すべてのコンストラクタとデストラクタに対して型の名前を繰り返す必要があります。残念ながら、唯一の解決策は、コードを生成するツールを用意することです。

2

構造体にポインタが含まれていない場合は、C++ 11でaggregate initializerを使用できます。

#include <iostream> 
using namespace std; 

struct xxx { 
    int a, b, c; 
}; 

int main() { 
    // your code goes here 
    xxx x{1,2,3}; 
    cout << x.a << x.b << x.c; 
    return 0; 
} 
+0

ありがとう!編集されました。 –

+1

@ M.M私の実装方法はC++ 11のみです。 オブジェクトxの作成時に '='を使用していません。 http://en.cppreference.com/w/cpp/language/aggregate_initialization –

0

いくつかのケースでは、あなたはstd::par<A, B>、またはstd::tuple<A, B, C>を使用すると便利かもしれません。例えば

std::tuple<A, B, C> t = std::make_tuple(a, b, c); 

これは、いくつかのケースでは、より良いあなたのために動作しますように。

+0

'std :: pair '? –

関連する問題