2014-12-05 6 views
0
class Base 
    { 
    public: 
     int i; 
     Base(int j):i(j){} 
    }; 

    int main() 
    { 
     Base B(10); 
     Base C[10](B);//throws error saying bad array initializer 
    } 

Когда я попытался скомпилировать этот код, вышеупомянутая ошибка была выбрана.Копировальный конструктор по массиву объектов

Почему C++ не компилирует этот код?

Почему каждый объект не может назвать конструктор копирования по умолчанию и использовать значение члена B?

Я что-то пропустил в стандарте C++?

+1

Вы можете сделать это с помощью вектора: 'станд :: вектор у (10, база (10));' – Borgleader

+0

Вы можете использовать список инициализации, но это будет не нужно поведение, которое вы хотите – Rerito

+0

@leemes Упс, да, я это имел в виду. ** Исправлено ** – Borgleader

ответ

2
Base C[10](B); 

Это неправильный синтаксис в C++; Вы не можете инициализировать массив простых объектов, передавая аргументы.

0
Base C[10]; 

не будет работать. Вам также нужно объявить конструктор по умолчанию, как вы указали, если взять int в качестве ввода, поэтому по умолчанию он не создается.

0

Что касается меня, я не вижу никаких причин, почему эта конструкция

Base C[10](B); 

Или, например, следующие

Base *C = new Base[10](8); 

не может быть действительным. Это зависит только от того, как вы хотите определить семантику.

Однако исторически для инициализации агрегатов в C++ используется список бит-инициализации.

Таким образом, вы можете написать

Base C[10]{ B, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; 
Смежные вопросы