2015-04-20 2 views
9

У меня есть класс Thing без конструктора по умолчанию.Инициализация массива элементов C++ без конструкторов по умолчанию

Теперь мы определяем еще один класс, который теперь должен инициализировать элементы массива одновременно, так как без конструктора по умолчанию невозможно выполнить позднее назначение. Таким образом, мы имеем:

class TwoThings 
{ 
    public: 

    Thing things[2]; 

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

Правильно ли это?

GCC компилирует его в полном порядке, в то время как Clang не делает этого, указывая «список инициализаторов». Я пробовал несколько альтернативных способов, таких как двойные фигурные скобки {{ ... }} и такие, но не могут получить компиляционный эквивалент для Clang.

Как инициализировать массивы без конструктора по умолчанию в Clang?

ответ

9

Да, инициализация массива элементов в скобках является расширением GCC. Чтобы сделать это стандарт, вы можете просто использовать один набор скобок (требуется C++ 11):

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

Если вы не можете использовать C++ 11, вы можете использовать другой метод хранения, например std::pair<Thing,Thing> или std::vector<Thing>.

+0

Таким образом, нет никакого способа без этого расширения или C++ 11 (разбивает многие из моих старых библиотек) для инициализации массива? – dronus

+1

Вы можете использовать другой метод хранения, например 'std :: pair ' или 'std :: vector '. – TartanLlama

+0

Я думаю, 'std :: vector' нужны элементы, имеющие конструктор по умолчанию тоже? – dronus