2012-08-06 19 views
18
eine konstante Größe Array in einer Initialisiererliste

ich eine Situation haben, die im Folgenden zusammengefasst werden können:initialisieren

class Test 
{ 

    Test(); 

    int MySet[10]; 

}; 

ist es möglich, MySet in einer Initialisierungsliste zu initialisieren?

wie diese Art von Initialisiererliste:

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

Gibt es eine Möglichkeit, eine konstante Größe Element-Array in einer Klasse initalizer Liste zu initialisieren?

+3

Für das, was es wert ist, 'Set' ist nicht nur ein Zeiger auf ein Array von '10' Ganzzahlen, noch ist es hier" statisch ". Vielmehr wird der Array-Name 'Set' in bestimmten Situationen zu einem Zeiger auf das erste Element des Arrays verfallen. Der Unterschied kann klar mit 'sizeof' gesehen werden - d. H.' Sizeof (Set) == 10 * sizeof (int)! = Sizeof (int *) '. –

+1

@StuartGolodetz Danke für die Klarstellung. Wenn ich "statisch" sagte, meinte ich "statisch" in der Form, dass es mit dem Objekt/der Instanz gespeichert wird und nicht nur irgendwo anders auf dem Heap. Natürlich ist das ein grober Missbrauch des Begriffs "statisch" von meiner Seite; Es tut uns leid. – Serge

+0

Keine Sorge :) Ich habe hauptsächlich nur versucht, den Unterschied zwischen Arrays und Zeigern zu klären, mit der Ausnahme, dass es dort ein Missverständnis gegeben haben könnte. –

Antwort

21

Zwar nicht in C++ 03, C++ 11 einleitet erweiterten initializer Listen. Sie können es tatsächlich tun, wenn Sie einen Compiler verwenden, der dem C++ 11-Standard entspricht.

struct Test { 
    Test() : set { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } { }; 
    int set[10]; 
}; 

Der obige Code wird unter Verwendung von g++ -std=c++0x -c test.cc korrekt kompiliert.


Wie bereits in den Kommentaren von einem hilfreich User unter mir, dieser Code nicht nicht kompiliert mit Microsofts VC++ Compiler, cl. Vielleicht kann mir jemand sagen, ob das Äquivalent mit funktioniert?

#include <array> 

struct Test { 
    Test() : set { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } } { }; 
    std::array<int, 10> set; 
}; 

Dies kompiliert auch g++ -std=c++0x -c test.cc mit fein.

+2

Ein weiterer guter Grund, C++ 11 (oder Teile davon) zu lieben! = D Vielen Dank! – Serge

+0

@Serge kein Problem! – oldrinb

+5

Beachten Sie, dass dieser Code nicht mit Visual C++ Version 11 und früher kompiliert (d. H. Kompiliert nicht mit Microsoft Visual Studio 2012 und Visual C++ ist der Hauptcompiler für die häufigste Plattform). Also, ** wenn Sie tragbaren Code wollen, tun Sie dies nicht **. Noch. –

4

Leider können Sie in C++ 03 Arrays in Initialisierungslisten nicht initialisieren. Sie können in C++ 11, obwohl, wenn Ihr Compiler neuere :)

siehe ist: How do I initialize a member array with an initializer_list?

+1

Sogar C++ 98 unterstützt die Nullinitialisierung von Arrays in Initialisierungslisten. –

3

„Ich verstehe, dass Set nur ein Zeiger auf das statische Array von 10 ganzen Zahlen“

Nein, das ist falsch: es ein Array ist, kein Zeiger.

Sie können es immer noch in der Initialisierungsliste des Konstruktors initialisieren.

Für einen Compiler, der nicht C++ 11 geschweiften Klammern Initialisierung (Visual C++ Version 11 und früher in den Sinn kommt) unterstützt Sie allerdings durch einige Reifen haben zu springen, wie unten dargestellt:

#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() 
{} 

Stattdessen roh-Arrays zu verwenden, obwohl, verwenden std::vector und C+++ 11 std::array, welche beide auch von Visual C++ unterstützt werden 11.