Constructor Initializerのメンバー配列の初期化
-
27-09-2019 - |
質問
class C
{
public:
C() : arr({1,2,3}) //doesn't compile
{}
/*
C() : arr{1,2,3} //doesn't compile either
{}
*/
private:
int arr[3];
};
その理由は、アレイをで初期化できることだと思います =
構文、つまり:
int arr[3] = {1,3,4};
質問
- どうすればやりたいことをすることができますか(つまり、 初期化 コンストラクターの配列(体内の要素を割り当てない))。それも可能ですか?
- C ++ 03標準は、CTOR初期化剤の集約(配列を含む)の初期化について特別なことを言っていますか?または、上記のコードの無効性は、他のいくつかのルールの結果ですか?
- C ++ 0x初期化リストは問題を解決しますか?
詩 ベクター、ブースト::アレイ、および私がよく知っている配列に対するそれらの優位性については言及しないでください。
解決
- どうすればやりたいことをすることができますか(つまり、コンストラクターの配列を初期化します(体内の要素を割り当てません))。それも可能ですか?
はい。配列を含む構造体を使用しています。あなたはすでにそれについて知っていると言いますが、それから私は質問を理解していません。そうすれば、あなた 行う ボディの割り当てなしで、コンストラクターの配列を初期化します。これは何 boost::array
します。
C ++ 03標準は、CTOR初期化剤の集約(配列を含む)の初期化について特別なことを言っていますか?または、上記のコードの無効性は、他のいくつかのルールの結果ですか?
Meminitializerは、直接初期化を使用します。条項8の規則は、この種のことを禁じています。次のケースについては正確にはわかりませんが、一部のコンパイラはそれを許可しています。
struct A {
char foo[6];
A():foo("hello") { } /* valid? */
};
見る このgcc pr 詳細については。
C ++ 0x初期化リストは問題を解決しますか?
はい、彼らはやる。しかし、あなたの構文は無効だと思います。ブレースを直接使用して、リストの初期化を発射する必要があります
struct A {
int foo[3];
A():foo{1, 2, 3} { }
A():foo({1, 2, 3}) { } /* invalid */
};
他のヒント
C ++ 98は、アレイをゼロ化(または非ポッド要素の場合、値のイニシアル化)以外のものに直接構文を提供しません。そのためにあなたはただ書くだけです C(): arr() {}
.
ロジャー・パテは、C ++ 0xの集計初期化の制限について間違っていることですが、私はそれを調べたりチェックしたりするのが面倒です。それは問題ではありませんか? 編集: :ロジャーは「C ++ 03」について話していましたが、「C ++ 0x」と誤解しました。申し訳ありませんが、ロジャー。 ☺
現在のコードのC ++ 98回避策は、配列をにラップすることです struct
そのタイプの静的定数から初期化します。とにかくデータはどこかに存在する必要があります。カフからこのように見えることがあります:
class C
{
public:
C() : arr( arrData ) {}
private:
struct Arr{ int elem[3]; };
Arr arr;
static Arr const arrData;
};
C::Arr const C::arrData = {{1, 2, 3}};
回避策:
template<class T, size_t N>
struct simple_array { // like std::array in C++0x
T arr[N];
};
class C : private simple_array<int, 3>
{
static simple_array<int, 3> myarr() {
simple_array<int, 3> arr = {1,2,3};
return arr;
}
public:
C() : simple_array<int, 3>(myarr()) {}
};
- いいえ、残念ながら。
- 文法では許可されていないため、望むようにできません(以下の詳細)。 CTORのような初期化のみを使用できます。ご存知のように、それは配列の各アイテムを初期化するために使用できません。
- 彼らは多くの有用な方法で全面的に初期化を一般化するので、私はそう信じています。しかし、詳細についてはわかりません。
C ++ 03では、集約初期化は以下と同様の構文にのみ適用されます。これは別のステートメントである必要があり、CTOR初期化には適合しません。
T var = {...};
どうですか
...
C() : arr{ {1,2,3} }
{}
...
?
G ++ 4.8で正常にコンパイルします
コンストラクターにintsの配列を開始したいですか?静的配列を指します。
class C
{
public:
int *cArray;
};
C::C {
static int c_init[]{1,2,3};
cArray = c_init;
}