Упомянутая в вашем вопросе конструкция (new(t) my_class(attribute)
) называется "размещение нового".Вот как это работает:
t
уже должен указывать на выделенную область памяти (размещение нового не выделяет по умолчанию) - Экземпляр
my_class
создается в этой ячейке памяти.
Однако, поскольку в вашем случае вы не можете использовать конструкторы, использование любой формы new
исключено.Но есть альтернатива (своего рода).
Поскольку размещение new в значительной степени просто перезаписывает чанк-память, мы можем использовать обычную функцию, которая делает то же самое с уже созданным объектом.Такой функцией является memcpy
:
void * memcpy ( void * destination, const void * source, size_t num );
Все, что memcpy
выполняет, выполняет побайтную копию num
байтов из памяти, на которую указывает source
, в память, на которую указывает destination
.
Допустим, вы начали с этого кода в load_construct_data
my_class obj = other_class::create();
Затем мы можем использовать функцию memcpy
, чтобы "переместить" значение в obj
в ссылку на память по t
:
memcpy((void*)t, (void*)(&obj), sizeof(obj));
Хотя есть некоторые подробности о том, как это работает с вашим конкретным классом, например, является ли побитовая копия «достаточно хорошей», это лучшийУ меня есть то, что вы спросили.Единственная проблема, которую я вижу, - если деструктор освобождает ресурсы, то копия может стать недействительной.
Чтобы учесть возможные проблемы с уничтожением, вы можете написать свою собственную функцию глубокого копирования:
void deepCopy( my_class * destination, const my_class * source );
, который вы называете вместо memcpy
.
Примечание : пожалуйста, скажите мне, сбился ли я с чем-то здесь.В настоящее время у меня нет машины для тестирования кода.