Сказать, что вы хотите создать массив Agent
без инициализации этих агентов, - анахронизм. Инициализация происходит во время строительства. Вы не можете создать что-либо, не выполнив какую-либо инициализацию.
Почти в каждом случае "правильная" вещь, которую нужно сделать в C ++, это использовать vector
или какой-либо другой стандартный контейнер для вашего массива, а затем push_back
новые элементы при их создании. Вы должны убедиться, что это правильный подход для вас. Ничего не зная о вашем приложении, вероятно, так оно и есть.
Возможно, вы имеете в виду (или, может быть, то, что хотите), чтобы создать пространство памяти для массива, а затем инициализировать их при загрузке. Это довольно редко, но это случается. В этом случае сначала вы можете выделить достаточно большой буфер char
, чтобы вместить все ваши элементы:
char buf[correct_size];
... и затем используйте place-new для инициализации Agent
s в этом буфере:
new (&buf[byte_index]) Agent(parameter_list);
Это сложно. При использовании нового размещения вы должны манипулировать несколькими вещами:
- Вы должны убедиться, что используете правильный
byte_index
в буфере.
- Вам нужно убедиться, что вы освободили в правильном порядке: сначала уничтожьте
Agent
, затем уничтожьте буфер, в котором они находятся.
- Вы должны явно вызвать деструктор, чтобы уничтожить
Agent
s:
Пример # 3:
Agent* agent = reinterpret_cast<Agent*>(&buf[byte_index]);
agent->~Agent();
Это рискованный код примерно миллионами разных способов. Я не могу особо подчеркнуть, что, как бы ни старались сделать это космическая эра и искушение, вам, вероятно, не следует делать это в рабочем коде. Использование размещения new должно быть последним средством, когда абсолютно ничего не будет работать.