C++ C++;与';运算符=';在我的自定义对象数组中
我有一个叫做KernelLock的类,我正在创建一个叫做myLockArray的KernelLock数组。我这样声明:C++ C++;与';运算符=';在我的自定义对象数组中,c++,arrays,operator-keyword,nachos,C++,Arrays,Operator Keyword,Nachos,我有一个叫做KernelLock的类,我正在创建一个叫做myLockArray的KernelLock数组。我这样声明:KernelLock-myLockArray[150] 当我尝试向myLockArray添加一个新的KernelLock时,我得到了前面提到的错误。下面是我得到错误的确切行: myLockArray[initializedLocksCounter] = new KernelLock(myAddrSpace, newLock); 下面是确切的错误: error: no match
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>))
错误:myLockArray[InitializedLocksCenter]=(((KernelLock*)运算符新(8u)),(->KernelLock::KernelLock(myAddrSpace,newLock),)中的“operator=”不匹配
如果有帮助,我将通过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);
std::向量核锁;
内核锁定。保留(某些大小);//如果你有一些合理的上限,最好保留
内核锁定。向后放置(myAddrSpace,newLock);
创建150个KernelLock
s的数组。然后尝试为其分配KernelLock*
。如果需要指针,则需要将数组更改为:
KernelLock* myLockArray[150];
如果你不需要指针,那么你只需要将你的赋值改为
myLockArray[initializedLocksCounter] = KernelLock(myAddrSpace, newLock);
这是一个包含150个内核锁的数组
当我尝试向myLockArray添加新的KernelLock时
不能向数组中添加任何对象。数组的大小总是恒定的。它总是有150把锁
myLockArray[initializedLocksCounter] = new KernelLock(myAddrSpace, newLock);
这是错误的new
返回动态分配对象的地址。您正试图将该地址分配给索引InitializedLocksCenter
处的现有KernelLock
对象。不能将地址分配给非指针对象(除非该对象具有相应的(非显式)构造函数)
如果你想要一个不断增长的数组,使用<代码> STD::vector < /COD>
< p>你根本上误解了C++中的对象是什么。这与Java不同
您的150KernelLock
对象是150KernelLock
对象。不是指针,也不是引用。其中有150个。您不能随时动态地“扩展”数组,使用new
这样做是动态分配,需要管理指针(KernelLock*
)
从听起来,你实际上想要一个std::vector
.new返回指针,而不是对象本身。如何返回对象本身?“当我尝试向myLockArray添加新的KernelLock时”等等,什么?你有一个150个内核的数组。你怎么能再加一个呢?听起来你把java和C++混淆了…这不是指针数组……或者您可以只存储指针。试试myLockArray[InitializedLocksCenter]=*(new KernelLock(myAddrSpace,newLock))@DOUGLASO.MOEN:因为内存泄漏很有趣!您建议编写一个数组溢出。因为myLockArray[InitializedLocksCenter]
不存在?根据问题,我假设KernelLock myLockArray[150]代码>以在分配之前执行。如果我们进一步假设initializedLocksCenter
是一个有效的索引,那么我看到的唯一问题是我们默认初始化150KernelLock
。我读它为initializedLocksCenter==150
,但我现在没有:)我编辑这个问题是为了使用一个通用但有效的,i
index:)我应该使用vector还是vector?@jonathanalengrant:vector
甚至不是有效的语法。你应该用我在回答中写的东西。你使用的是哪本C++书?猜测并不是一种很好的编程方式:(我该如何处理向量?@jonathanalengrant我建议你看看推荐的一本书,了解基本知识。
KernelLock myLockArray[150];
myLockArray[initializedLocksCounter] = new KernelLock(myAddrSpace, newLock);