私は以下に要約できる状況を持っています:
class Test
{
Test();
int MySet[10];
};
MySet
イニシャライザリストで初期化することは可能ですか?
この種の初期化子リストのように:
Test::Test() : MySet({1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) {}
クラスのイニシャライザーリストで一定サイズのメンバー配列を初期化する方法はありますか?
私は以下に要約できる状況を持っています:
class Test
{
Test();
int MySet[10];
};
MySet
イニシャライザリストで初期化することは可能ですか?
この種の初期化子リストのように:
Test::Test() : MySet({1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) {}
クラスのイニシャライザーリストで一定サイズのメンバー配列を初期化する方法はありますか?
C ++ 03では使用できませんが、C++11では拡張初期化子リストが導入されています。C ++ 11標準に準拠したコンパイラを使用すれば、実際にそれを行うことができます。
struct Test {
Test() : set { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } { };
int set[10];
};
上記のコードは、を使用して正常にコンパイルされますg++ -std=c++0x -c test.cc
。
コメントで役立つユーザーが私の下で指摘しているように、このコードはMicrosoftのVC++コンパイラclを使用してコンパイルされません。おそらく誰かが同等の使用std::array
意志かどうか私に言うことができますか?
#include <array>
struct Test {
Test() : set { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } } { };
std::array<int, 10> set;
};
これも、を使用して正常にコンパイルされますg++ -std=c++0x -c test.cc
。
残念ながら、C ++ 03では、初期化子リストの配列を初期化できません。コンパイラが新しい場合でも、C++11で使用できます:)
「Setは10個の整数の静的配列への単なるポインタであることを理解しています」
いいえ、それは間違っています。これは配列であり、ポインタではありません。
コンストラクターの初期化子リストで初期化することもできます。
C ++ 11中括弧の初期化をサポートしていないコンパイラ(Visual C ++バージョン11以前が頭に浮かぶ)の場合は、以下に示すように、いくつかのフープをジャンプする必要があります。
#include <iostream>
#include <vector>
using namespace std;
#define CPP11
#if defined( _MSC_VER )
# if (_MSC_VER <= 1700)
# undef CPP11
# endif
#endif
#ifdef CPP11
class Cpp11
{
private:
int set_[10];
public:
Cpp11()
: set_{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
{}
int foo() const { return set_[3]; }
};
#endif
class Cpp03
{
private:
struct IntArray10 { int values[10]; };
IntArray10 set_;
static IntArray10 const& oneToTen()
{
static IntArray10 const values =
{ {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} };
return values;
}
public:
Cpp03()
: set_( oneToTen() )
{}
int foo() const { return set_.values[3]; }
};
int main()
{}
ただし、生の配列を使用する代わりに、std::vector
C +++ 11std::array
を使用してください。どちらも、Visual C++11でもサポートされています。