2016-01-15 13 views
11

Vorrei creare un costruttore, che è simile al costruttore int matrice: int foo[3] = { 4, 5, 6 };Come creare un costruttore di array per la mia classe?

Ma vorrei usare in questo modo:

MyClass<3> foo = { 4, 5, 6 }; 

C'è una matrice di n dimensione privata nel mio classe:

template<const int n=2> 
class MyClass { 

    public: 

     // code... 

    private: 

     int numbers[n]; 

     // code... 

}; 
+5

Prova googling 'Elenco di inizializzazione C++ 11' – MikeCAT

+0

Il tipo' int [3] 'non è un tipo di classe, quindi non ha un costruttore. Può essere * inizializzato *, ma non tramite una chiamata del costruttore. –

risposta

18

Avete bisogno di un costruttore che accetta un argomento std::initializer_list:

MyClass(std::initializer_list<int> l) 
{ 
    ...if l.size() != n throw/exit/assert etc.... 
    std::copy(l.begin(), l.end(), &numbers[0]); 
} 

TemplateRex commentato ...

Si potrebbe voler avvertire che such constructors are very greedy e possono facilmente portare a comportamenti indesiderati. Per esempio. MyClass non dovrebbe avere costruttori che prendono un paio di int s.

... ed era nervoso un moderatore iperattivo potrebbe eliminarlo, quindi qui è in relativa sicurezza. :-)

+5

Si potrebbe voler avvertire che [tali costruttori sono molto avidi] (http://stackoverflow.com/q/19847960/819272) e possono facilmente portare a comportamenti indesiderati. Per esempio. 'MyClass' non dovrebbe avere costruttori che prendono una coppia di' int's, ad es. – TemplateRex

+0

[vedi qui] (http://stackoverflow.com/questions/34717823/can-using-a-lambda-in-header-files-violate-the-odr#comment57382669_34721371) per la golosa moderazione. – TemplateRex

Problemi correlati