我有一个名为KernelLock的类,我正在创建一个名为myLockArray的KernelLocks数组。我声明如下: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。
答案 0 :(得分:3)
KernelLock myLockArray[150];
创建一个150 KernelLock
的数组。然后,您尝试为其分配KernelLock *
。如果你想要指针,那么你需要将数组更改为:
KernelLock* myLockArray[150];
如果您不想要指针,则只需将作业更改为
即可myLockArray[initializedLocksCounter] = KernelLock(myAddrSpace, newLock);
答案 1 :(得分:2)
KernelLock myLockArray[150];
这是一个包含150个内核锁的数组。
当我尝试将新的KernelLock添加到myLockArray
时
您无法向阵列添加任何对象。数组的大小始终是不变的。它总是有150个锁。
myLockArray[initializedLocksCounter] = new KernelLock(myAddrSpace, newLock);
这是错误的。 new
返回动态分配的对象的地址。您正尝试将该地址分配给索引KernelLock
处的现有initializedLocksCounter
对象。您不能将地址分配给非指针对象(除非该对象具有相应的(非显式)构造函数)。
如果您想要一个不断增长的数组,请使用std::vector<KernelLock>
答案 2 :(得分:2)
您从根本上误解了C ++中的对象是什么。它与Java不同。
您的150个KernelLock
个对象是150个KernelLock
个对象。不是指针,也不是引用。其中有150个。您无法随意动态“扩展”数组,而使用new
进行动态分配则需要管理指针(KernelLock*
)。
从它的声音中,你实际上想要一个std::vector<KernelLock>
。
答案 3 :(得分:1)
您不能使用KernelLock*
类型的值作为KernelLock
&#39; s数组的元素。你只需:
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);