C++与自定义对象数组中的'operator='不匹配



我有一个名为KernelLock的类,我正在创建一个名为myLockArray的KernelLocks数组。我这样声明:KernelLock myLockArray[150];

当我尝试将新的内核锁添加到myLockArray时,我收到上述错误。这是我收到错误的确切行:

myLockArray[initializedLocksCounter] = new KernelLock(myAddrSpace, newLock);

这是确切的错误:

error: no match for 'operator=' in 'myLockArray[initializedLocksCounter] = (((KernelLock*)operator new(8u)), (<anonymous>->KernelLock::KernelLock(myAddrSpace, newLock), <anonymous>))

如果有帮助,我正在通过 Nachos 使用 gcc 进行编译。

KernelLock myLockArray[150];

创建 150 KernelLock 秒的数组。 然后,尝试为其分配KernelLock *。 如果你想要指针,那么你需要将数组更改为:

KernelLock* myLockArray[150];

如果您不想要指针,则只需将作业更改为

myLockArray[initializedLocksCounter] = KernelLock(myAddrSpace, newLock);
KernelLock myLockArray[150];

这是一个包含 150 个内核锁的数组。

当我尝试将新的内核锁添加到 myLockArray 时

不能向数组中添加任何对象。数组的大小始终是恒定的。它总是有 150 个锁。

myLockArray[initializedLocksCounter] = new KernelLock(myAddrSpace, newLock);

这是错误的。 new返回动态分配对象的地址。您正在尝试将该地址分配给索引initializedLocksCounter处的现有KernelLock对象。不能为非指针对象分配地址(除非该对象具有相应的(非显式(构造函数(。

如果您想要一个不断增长的阵列,请使用std::vector<KernelLock>

你从根本上误解了C++中的对象是什么。这不像在Java中。

您的 150 个KernelLock对象是 150 个KernelLock对象。不是指针,也不是引用。其中有150个。您不能随时动态"扩展"数组,而使用 new 这样做是动态分配,需要管理指针 (KernelLock* (。

从它的声音来看,你实际上想要一个std::vector<KernelLock>.

以下是一些学习C++基础知识的资源。

不能将类型为 KernelLock* 的值用作 KernelLock 数组的元素。您只需执行以下操作:

myLockArray[i] = KernelLock(myAddrSpace, newLock);

其中i是有效索引。

但是,请注意,通过这样做,无论如何,您都将付出默认初始化150 KernelLock的代价(这可能很昂贵(。最好使用标准库:

std::vector<KernelLock> kernel_locks;
kernel_locks.reserve(some_size); // better to reserve if you have some sensible upper bound
kernel_locks.emplace_back(myAddrSpace, newLock);

相关内容

最新更新