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

C++ no match for 'operator=' in my custom object array

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

当我尝试向 myLockArray 添加新的 KernelLock 时,出现上述错误。这是我收到错误的确切行:

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* 类型的值作为 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);
KernelLock myLockArray[150];

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

KernelLock* myLockArray[150];

如果您不想要指针,那么您只需要将您的分配更改为

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

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

When I try to add a new KernelLock to myLockArray

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

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

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

如果你想要一个不断增长的数组,使用std::vector<KernelLock>

您基本上误解了 C++ 中的对象是什么。这不像 Java.

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

听起来,你其实想要一个std::vector<KernelLock>

Here are some resources for learning the basics of C++.