无法从数组中的指针元素创建新类

时间:2016-03-13 05:56:35

标签: c++ arrays class pointers class-constructors

我有一个班级类型的数组" Room"。 Room有两个构造函数,默认和自定义。我想在初始化Room数组的元素时调用特定的构造函数。默认或自定义都不起作用。我收到此错误:

没有操作员" ="匹配这些操作数,操作数类型是Room = Room *

这是我的代码:

btw房间是房间指针类型

void RoomManager::createRooms()
{
    rooms = new Room[numOfRooms];

    for (int i = 0; i < numOfRooms; i++)
    {
       rooms[i] = new Room();
    }
}`

我应该怎么做?

由于

2 个答案:

答案 0 :(得分:0)

首先,没有理由在你的循环中调用默认构造函数,c ++在分配数组时已经为你做了。 但是,如果要创建数组并使用自定义构造函数调用初始化其元素,则可以使用placement new operator

#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();
    }
}

如果您使用placement new,则必须在程序结束时手动调用析构函数:

    for (int i = 0; i < numOfRooms; i++)
    {
       rooms[i].~Room();
    }
    operator delete[](rooms);

答案 1 :(得分:0)

错误原因:

roomsRoom的数组。对rooms OP的每个元素分配指向RoomRoom *的指针。 RoomRoom *不兼容,因此编译器无法为该分配生成代码。

解决方案:

幸运的是,根本不需要任务。 rooms = new Room[numOfRooms]分配并默认为您构建了所有房间。

void RoomManager::createRooms()
{
    rooms = new Room[numOfRooms];
}

另外,您想以这种方式分配房间是值得怀疑的。设置numOfRooms后,立即调用allocate并为自己保存额外的功能。

更好的方法是考虑使用std::vector