2012-08-06 10 views
18

Ho una situazione che si può riassumere nella seguente:inizializzare un array di dimensioni costante in una lista di inizializzazione

class Test 
{ 

    Test(); 

    int MySet[10]; 

}; 

è possibile inizializzare MySet in una lista di inizializzazione?

piace questo tipo di lista di inizializzazione:

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

C'è un modo per inizializzare un array di membro costante dimensioni nella lista initalizer di una classe?

+3

per quel che vale, 'set' non è solo un puntatore a un array di interi '10', né qui' static'. Piuttosto, il nome dell'array 'Set' decade in un puntatore al primo elemento dell'array in determinate situazioni. La differenza può essere vista chiaramente usando 'sizeof' - cioè' sizeof (Set) == 10 * sizeof (int)! = Sizeof (int *) '. –

+1

@StuartGolodetz Grazie per il chiarimento. Quando ho detto statico, intendevo statico nella forma in cui è memorizzato con l'oggetto/istanza e non solo da qualche altra parte nell'heap. Naturalmente, questo è un grosso uso improprio del termine "statico" da parte mia; scusa. – Serge

+0

Nessun problema :) Stavo solo cercando di chiarire la distinzione tra array e puntatori sulla possibilità che ci potesse essere un malinteso là. –

risposta

21

Anche se non è disponibile in C++ 03, C++ 11 introduce liste di inizializzazione estesi. Si può davvero farlo se si utilizza un compilatore conforme allo standard C++ 11.

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

Il codice sopra riportato viene compilato utilizzando g++ -std=c++0x -c test.cc.


Come sottolineato sotto di me da un utente utile nei commenti, questo codice non compila usando VC++ di Microsoft compilatore, cl. Forse qualcuno può dirmi se l'equivalente usando std::array sarà?

#include <array> 

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

Anche questo viene compilato utilizzando g++ -std=c++0x -c test.cc.

+2

Un altro buon motivo per amare C++ 11 (o alcune parti di esso)! = D Grazie mille! – Serge

+0

@Serge nessun problema! – oldrinb

+5

Si noti che questo codice non viene compilato con Visual C++ versione 11 e precedenti (vale a dire, non viene compilato con Microsoft Visual Studio 2012 e Visual C++ è il compilatore principale per la piattaforma più comune). Quindi, ** se vuoi un codice portatile, non farlo **. Ancora. –

4

Sfortunatamente, in C++ 03, non è possibile inizializzare gli array negli elenchi di inizializzatori. È possibile in C++ 11 ma se il vostro compilatore è più recente :)

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

+1

Anche C++ 98 supporta l'inizializzazione a zero degli array negli elenchi di inizializzatori. –

3

"Capisco che Set è solo un puntatore alla matrice statica di 10 numeri interi"

No, è sbagliato: si tratta di un array, non un puntatore.

È ancora possibile inizializzarlo nell'elenco di inizializzazione del costruttore.

Per un compilatore che non supporta C++ 11 sostegni ricci di inizializzazione (Visual C++ versione 11 e precedenti viene in mente) si dovrà passare attraverso alcuni cerchi, però, come illustrato di seguito:

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

Invece di usare matrici prime, però, utilizzare std::vector e C+++ 11 std::array, entrambi i quali sono supportati anche da Visual C++ 11.