Не могу создать новый класс из элемента указателя в массиве

У меня есть массив моего класса типа "Комната". Есть два конструктора для 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,

Другие вопросы по тегам