Не могу создать новый класс из элемента указателя в массиве
У меня есть массив моего класса типа "Комната". Есть два конструктора для Room, по умолчанию и custom. Я хочу вызвать конкретный конструктор при инициализации элементов моего массива Room. Ни по умолчанию, ни на заказ не работает. Я получаю эту ошибку:
Ни один оператор "=" не соответствует этим операндам, типы операндов: Room = Room *
Вот мой код:
кстати номера указатель номера
void RoomManager::createRooms()
{
rooms = new Room[numOfRooms];
for (int i = 0; i < numOfRooms; i++)
{
rooms[i] = new Room();
}
}`
Как я должен идти об этом?
Спасибо
2 ответа
Во-первых, нет причин вызывать конструктор по умолчанию в вашем цикле, C++ уже сделал это для вас при выделении массива. Но если вы хотите создать массив и инициализировать его элементы с помощью вызова пользовательского конструктора, вы можете использовать оператор размещения new
#include <new>
// ...
void RoomManager::createRooms()
{
rooms = static_cast<Room*>(operator new[](numOfRooms * sizeof(Room)));
for (int i = 0; i < numOfRooms; i++)
{
new &(rooms[i]) Room();
}
}
И если вы используете размещение новых, вы должны вручную вызвать деструктор в конце программы:
for (int i = 0; i < numOfRooms; i++)
{
rooms[i].~Room();
}
operator delete[](rooms);
Причина ошибки:
rooms
это массив Room
, Для каждого элемента rooms
ОП назначает указатель на Room
, Room *
, Room
а также Room *
несовместимы, поэтому он не может сгенерировать код для назначения.
Решение:
К счастью, нет необходимости в назначении вообще. rooms = new Room[numOfRooms]
выделены и по умолчанию построены все ваши комнаты для вас.
void RoomManager::createRooms()
{
rooms = new Room[numOfRooms];
}
Кроме того, сомнительно, что вы хотите распределить комнаты таким образом. когда numOfRooms
установлено, вы вызываете allocate сразу после и сохраняете себе дополнительную функцию.
Еще лучший способ - рассмотреть возможность использования std::vector
,