我有一个名为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);