【问题标题】:C++ no match for 'operator=' in my custom object arrayC++ 在我的自定义对象数组中不匹配 'operator='
【发布时间】:2016-01-15 14:15:17
【问题描述】:

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

如果有帮助,我正在通过 Nachos 使用 gcc 进行编译。

【问题讨论】:

  • new 返回一个指针,而不是对象本身。
  • 我如何返回对象本身?
  • “当我尝试将新的 KernelLock 添加到 myLockArray 时” 等等,什么?您有一个包含 150 个内核锁的数组。你怎么能添加另一个?听起来你在混淆 Java 和 C++ ......这不是一个指针数组......
  • 或者你可以只存储指针。试试 myLockArray[initializedLocksCounter] = *(new KernelLock(myAddrSpace, newLock))
  • @DOUGLASO.MOEN:因为内存泄漏很有趣!

标签: c++ arrays operator-keyword nachos


【解决方案1】:
KernelLock myLockArray[150];

创建一个包含 150 个KernelLocks 的数组。然后,您尝试为其分配KernelLock *。如果你想要指针,那么你需要将你的数组更改为:

KernelLock* myLockArray[150];

如果您不想要指针,那么您只需将分配更改为

myLockArray[initializedLocksCounter] = KernelLock(myAddrSpace, newLock);

【讨论】:

    【解决方案2】:
    KernelLock myLockArray[150];
    

    这是一个包含 150 个内核锁的数组。

    当我尝试将新的 KernelLock 添加到 myLockArray 时

    您不能将任何对象添加到数组中。数组的大小始终是恒定的。它总是有 150 个锁。

    myLockArray[initializedLocksCounter] = new KernelLock(myAddrSpace, newLock);
    

    这是错误的。 new 返回动态分配对象的地址。您正在尝试将该地址分配给索引initializedLocksCounter 处的现有KernelLock 对象。您不能将地址分配给非指针对象(除非该对象具有相应的(非显式)构造函数)。

    如果您想要一个不断增长的数组,请使用std::vector&lt;KernelLock&gt;

    【讨论】:

    • 我如何使用向量来做到这一点?
    • @JonathanAllenGrant 我建议查看推荐的书籍之一here 了解基础知识。
    【解决方案3】:

    您从根本上误解了 C++ 中的对象是什么。这和 Java 不同。

    您的 150 个 KernelLock 对象是 150 个 KernelLock 对象。不是指针,也不是引用。其中有 150 个。您不能随时动态“扩展”数组,而使用 new 这样做是动态分配,需要管理指针 (KernelLock*)。

    听上去,你实际上想要一个std::vector&lt;KernelLock&gt;

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

    【讨论】:

    • 我应该使用vector还是vector?
    • @JonathanAllenGrant: vector&lt;*KernelLock&gt; 甚至不是有效的语法。您应该使用我在回答中写的内容。您正在使用哪本 C++ 书籍?猜测不是编程的好方法:(
    【解决方案4】:

    您不能使用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);
    

    【讨论】:

    • 你提议写一个数组溢出。
    • 因为myLockArray[initializedLocksCounter]不存在?
    • 根据问题,我假设KernelLock myLockArray[150]; 在分配之前。如果我们还假设 intiializedLocksCounter 是一个有效的索引,我看到的唯一问题是我们默认初始化 150 KernelLock
    • 我读它为initializedLocksCounter==150,但我现在不读它:)
    • 我编辑了问题,以便使用通用但有效的i index :)
    猜你喜欢
    • 1970-01-01
    • 2019-04-09
    • 2018-05-23
    • 2021-05-21
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2013-07-31
    相关资源
    最近更新 更多