Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;与';运算符=';在我的自定义对象数组中_C++_Arrays_Operator Keyword_Nachos - Fatal编程技术网

C++ C++;与';运算符=';在我的自定义对象数组中

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的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>))
错误: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不同

您的150
KernelLock
对象是150
KernelLock
对象。不是指针,也不是引用。其中有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
是一个有效的索引,那么我看到的唯一问题是我们默认初始化150
KernelLock
。我读它为
initializedLocksCenter==150
,但我现在没有:)我编辑这个问题是为了使用一个通用但有效的,
i
index:)我应该使用vector还是vector?@jonathanalengrant:
vector
甚至不是有效的语法。你应该用我在回答中写的东西。你使用的是哪本C++书?猜测并不是一种很好的编程方式:(我该如何处理向量?@jonathanalengrant我建议你看看推荐的一本书,了解基本知识。
KernelLock myLockArray[150];
myLockArray[initializedLocksCounter] = new KernelLock(myAddrSpace, newLock);