0

我有一个名为 KernelLock 的类,我正在创建一个名为 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 进行编译。

4

4 回答 4

3
KernelLock myLockArray[150];

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

KernelLock* myLockArray[150];

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

myLockArray[initializedLocksCounter] = KernelLock(myAddrSpace, newLock);
于 2015-10-16T18:17:43.263 回答
2
KernelLock myLockArray[150];

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

当我尝试将新的 KernelLock 添加到 myLockArray

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

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

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

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

于 2015-10-16T18:19:23.643 回答
2

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

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

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

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

于 2015-10-16T18:19:55.630 回答
1

您不能将类型的值用作'sKernelLock*数组的元素。KernelLock你只需这样做:

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

wherei是一个有效的索引。

但是,请注意,这样做150 KernelLock无论如何都会为 default-initializing 付出代价(这可能很昂贵)。使用标准库会更好:

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);
于 2015-10-16T18:17:36.020 回答