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

时间:2015-10-16 18:14:36

标签: c++ arrays operator-keyword nachos

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

4 个答案:

答案 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>

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

答案 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);