2015-08-03 2 views
1

Я бегу в неприятности, если я хотел бы создать массив объектов, как это:Как создать массив объектов, которые не перемещаются/копировать конструктивны

SM sc[8]{{0},{1},{2},{3},{4},{5},{6},{7}}; 

Конструктор для СМ определяется как:

SM::SM(int); 

Потому что в C++ Each member is copy-initialized from the corresponding initializer-clause., у меня есть нерешенная проблема.

Я уже прочитал:

Move Constructors and Static Arrays

Initialization of member array objects avoiding move constructor

Move constructor is required even if it is not used. Why?

constexpr array of constexpr objects using move ctor

Да, все ответы, описывающие очень хорошо, что Giong на инициализацию список, но я мог бы не нашел идеи, как получить статический массив o f теперь.

Есть ли какая-нибудь работа для решения этой проблемы? Создание массива указателей и инициализация времени выполнения с помощью новой или новой операции @ требуют намного большего времени работы в памяти. Это немного проблематично, потому что я на 8-битном контроллере AVR.

+0

Вы упоминаете «проблему» и «эту проблему», но не указываете фактическую ошибку. – Drop

+0

Ошибка: SM :: SM (SM &&) неявно удаляется, поскольку определение по умолчанию будет плохо сформировано: SM :: SM (SM &&) = default; Длинный список ошибок проходит через длинный список подклассов, которые унаследованы от моего класса SM. Возможно, я смогу свести свою проблему до полного примера. Но это не помогает, потому что тот факт, что класс не может быть сконструирован, будет сохранен. – Klaus

+0

[Работает для меня] (http://coliru.stacked-crooked.com/a/f67d4683fe50095d). –

ответ

3

Просто некоторая обратная связь, в ответ из-за фрагменты кода:

Адаптирование код на 3rd link в:

#include <iostream> 
using namespace std; 

struct SM { 
    int val; 
    SM(int a) : val(a) { cout <<"Constructor val="<<a<<endl;} 
    ~SM() { cout << "Destructor val="<<val<<endl; } 

    SM(const SM&) = delete; 
    SM(SM&&) = delete; 
}; 

int main() 
{ 
    SM sc[8] = { {0},{1},{2},{3},{4},{5},{6},{7} }; 
    return 0; 
} 

компиляции с

g++ -std=c++11 

и работает, результаты:

Constructor val=0 
Constructor val=1 
Constructor val=2 
Constructor val=3 
Constructor val=4 
Constructor val=5 
Constructor val=6 
Constructor val=7 
Destructor val=7 
Destructor val=6 
Destructor val=5 
Destructor val=4 
Destructor val=3 
Destructor val=2 
Destructor val=1 
Destructor val=0 

В чем же проблема?

+0

Проблема довольно проста: мой класс SM НЕ копирует и не перемещает конструкцию. В вашем классе задан конструктор копирования и перемещения по умолчанию. Для моего класса оба недействительны. – Klaus

+0

Каковы тогда будут конструкторы вашего класса? – Kenney

+0

@Klaus Как [это] (http://coliru.stacked-crooked.com/a/628bc19fe40f0358)? Если нет, вы должны добавить еще один код в свой вопрос: [M (C) VE] (http://stackoverflow.com/help/mcve) – Drop

1

«copy-initialized» не означает «вызывает конструктор копирования».

C++ 14 8.5/15:

инициализации, которая происходит в форме

T x = a; 

, а также в передачи аргументов, возврата функции, вызов исключения, обработка исключения и инициализация элемента агрегата называется копирование-инициализация.

Обратите внимание, что инициализатор и инициализированный объект могут иметь разные типы.

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

Смежные вопросы