2012-08-06 4 views
18

で一定の大きさの配列を初期化:私は、次の中でまとめることができる状況持っている初期化子リスト

class Test 
{ 

    Test(); 

    int MySet[10]; 

}; 

を初期化子リストでMySetを初期化することが可能ですか?初期化子リストのこの種のよう

Test::Test() : MySet({1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) {} 

は、クラスのinitalizerリストにある一定のサイズのメンバーの配列を初期化する方法はありますか?

+3

によってサポートされていますどちらもstd::vectorとC+++ 11 std::arrayを、使用は、 'Set'はへの単なるポインタではありません'10'の整数の配列でも、静的でもありません。むしろ、配列名 'Set'は、特定の状況で配列の最初の要素へのポインタに減衰します。違いは 'sizeof'を使って明瞭に見ることができます。つまり、sizeof(int)!= sizeof(int *)' sizeof(Set)== 10 * sizeof(int)! –

+1

@StuartGolodetz説明をありがとう。私が静的と言ったとき、私はそれがオブジェクト/インスタンスと共に格納され、ヒープ内の他の場所ではないという形で静的であることを意味しました。もちろん、これは私の言うところの「静的」という言葉の重大な誤用です。ごめんなさい。 – Serge

+0

心配はありません:)私は主に、誤解があった可能性があることについて、配列とポインタの区別を明確にしようとしていました。 –

答えて

21

:あなたは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を使用して細かくコンパイルされます。

+2

C++ 11(またはその一部)を愛するもう一つの良い理由! = Dありがとう! – Serge

+0

@Serge問題ありません! – oldrinb

+5

このコードは、Visual C++バージョン11以前ではコンパイルされません(つまり、Microsoft Visual Studio 2012でコンパイルされず、Visual C++が最も一般的なプラットフォームのメインコンパイラです)。したがって、**ポータブルコードが必要な場合は**これをしないでください。それでも。 –

4

残念ながら、C++ 03では、初期化リストの配列を初期化できません。 C++ 03では利用できませんが、C++ 11が拡張初期化子リストを紹介しHow do I initialize a member array with an initializer_list?

+1

C++ 98でもイニシャライザリストの配列のゼロ初期化がサポートされています。 –

3

「私はセット10個の整数の静的な配列への単なるポインタであることを理解し、」いいえ、それは間違っている:それは、配列、ポインタではないのです。

コンストラクタの初期化子リストでも初期化できます。

#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() 
{} 
:C++ 11中括弧の初期化をサポートしていませんコンパイラ(のVisual C++バージョン11およびそれ以前のが頭に浮かぶ)あなたは以下に示すように、しかし、いくつかのフープを介してジャンプする必要がありますについては

代わりに生の配列を使用しての、しかし、それは価値がある何のためにもビジュアルC++ 11

関連する問題