2015-04-20 23 views
9

Posiadam klasę Thing bez domyślnego konstruktora.Inicjalizacja macierzy elementów C++ bez domyślnych konstruktorów

Teraz definiujemy inną klasę, która musi teraz inicjalizować elementy tablicy jednocześnie, ponieważ bez domyślnego konstruktora nie można wykonać późnego przypisania. Mamy więc:

class TwoThings 
{ 
    public: 

    Thing things[2]; 

    TwoThings() : things({Thing("thing 1"),Thing("thing 2")}) 
    { 
    } 
} 

Czy to jest właściwy sposób?

GCC kompiluje to dobrze, podczas gdy Clang nie, należy podać "listę inicjalizującą". Próbowałem kilka alternatywnych sposobów, takich jak podwójne nawiasy klamrowe {{ ... }} i takie, ale nie uda nam się uzyskać odpowiednika kompilacji dla Clanga.

Jak zainicjować tablice bez domyślnego konstruktora w Clang?

Odpowiedz

9

Tak, inicjalizacja macierzy z nawiasami jest rozszerzeniem GCC. Aby to standard, można po prostu użyć jednego zestawu szelki (wymaga C++ 11):

TwoThings() : things{Thing("thing 1"),Thing("thing 2")} 
{ 
} 

Jeśli nie można używać C++ 11, można użyć innego sposobu przechowywania, jak std::pair<Thing,Thing> lub std::pair<Thing,Thing> lub .

+0

Więc nie ma mowy bez tego rozszerzenia lub C++ 11 (zrywa wiele moich starszych bibliotek), aby zainicjować tablicę? – dronus

+1

Można użyć innej metody przechowywania, np. 'Std :: pair ' lub 'std :: vector '. – TartanLlama

+0

Sądzę, że 'std :: vector' będzie potrzebował elementów posiadających domyślny konstruktor? – dronus

Powiązane problemy