【问题标题】:add element to array of struct in C++ encountered "error no match for ‘operator=’"在 C++ 中向结构数组添加元素遇到“错误与‘operator=’不匹配”
【发布时间】:2016-01-16 23:54:22
【问题描述】:

我的代码是

#include <iostream>
#include <string>
using namespace std;
struct Numbers{
    int a;
    int b;
    int c;
};

struct NumbersArray{
    int size;
    Numbers *numbers;
};
int main(){
    NumbersArray numArr;
    numArr.size = 10;
    numArr.numbers = new Numbers[10];
    for(int i = 0; i < 10; i++){
        Numbers *num = new Numbers;
        num->a = i * 3 + 0;
        num->b = i * 3 + 1;
        num->c = i * 3 + 2;
        numArr.numbers[i] = num;
    }
}

基本思想是我创建一个名为 Numbers 的结构,其中包含 3 个数字,并将其放入一个名为 NumbersArray 的包装结构中。 当我用 g++ 编译它时,我收到了错误消息

testArrayStruct.cc: In function ‘int main()’:
testArrayStruct.cc:23:27: error: no match for ‘operator=’ (operand types are ‘Numbers’ and ‘Numbers*’)
         numArr.numbers[i] = num;
                           ^
testArrayStruct.cc:23:27: note: candidate is:
testArrayStruct.cc:4:8: note: Numbers& Numbers::operator=(const Numbers&)
 struct Numbers{
        ^
testArrayStruct.cc:4:8: note:   no known conversion for argument 1 from ‘Numbers*’ to ‘const Numbers&’

这里忽略内存管理。 我不知道如何向数组中添加元素。

【问题讨论】:

  • 阅读 c++ 中的指针与值。

标签: c++ arrays operator-keyword


【解决方案1】:

你在错误的事情上练习,你只会 以这种方式养成坏习惯。 C++ 在价值语义上茁壮成长, 专注于此:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

struct Numbers {
    int a;
    int b;
    int c;
};

using NumbersArray = vector<Numbers>;

int main()
{
    NumbersArray numArr;
    numArr.resize(10);
    for(int i = 0; i < 10; i++)
    {
        Numbers num;
        num.a = i * 3 + 0;
        num.b = i * 3 + 1;
        num.c = i * 3 + 2;
        numArr[i] = num;
    }
}

【讨论】:

    【解决方案2】:

    应该是(忽略你所要求的内存管理):

    numArr.numbers[i] = *num;
    

    代替

    numArr.numbers[i] = num;
    

    因为numArr.numbers[i] 属于Numbers 类型,而num 属于Numbers* 类型。

    编辑:

    错误实际上告诉您没有operator= 来执行将Numbers * 分配给Numbers。所以实际上你可以实现你自己的operator= 来执行这样的操作:

    Numbers& operator=(Numbers& left, const Numbers * const right)
    {
        if (right != NULL) // or nullptr for C++11
        {
            left = *right;
        }
        return left;
    }
    

    通过这样的实现,您的原始代码也可以编译。

    关于内存管理的一点评论。没有必要在 for 循环中分配新的 Numbers,因为无论如何您都将该内容复制到 numArr.numbers 中。所以你可以这样写:

    for(int i = 0; i < 10; i++){
        numArr.numbers[i].a = i * 3 + 0;
        numArr.numbers[i].b = i * 3 + 1;
        numArr.numbers[i].c = i * 3 + 2;
    }
    

    【讨论】:

    • numArr.numbers[i] = *num; 将泄漏num
    • @zenith 为什么要投反对票?他明确要求忽略内存管理并帮助他理解为什么会出现编译错误。
    • 不是我的反对意见。是的,我没有注意到 OP 要求忽略内存管理问题。
    • @zenith 你不应该删除你的答案。很抱歉我在那里发表粗鲁的评论(我删除了它)我只是认为这是你的反对票。
    • 别担心,我正在写另一个与你的内容不同的答案:)
    【解决方案3】:

    如何向数组中添加元素

    你不能。

    当您说new Numbers[10] 时,您创建了一个包含十个默认初始化元素的数组。数组初始化后不能自行调整大小。

    听起来你应该使用std::vector

    int main() {
        std::vector<Numbers> numArr;
    
        for(int i = 0; i < 10; i++) {
            Numbers num;
            num.a = i * 3 + 0;
            num.b = i * 3 + 1;
            num.c = i * 3 + 2;
            numArr.push_back(num);
        }
    
        std::cout << "numArr contains " << numArr.size() << " elements." << std::endl;
    }
    

    现在您可以添加任意数量的元素,而不必自己跟踪size 等。 std::vector 会在需要时自行调整大小。

    【讨论】:

      【解决方案4】:

      试试下面的代码。您尝试将对象的指针分配给对象本身。以下修复它。

      #include <iostream>
      #include <string>
      using namespace std;
      struct Numbers{
          int a;
          int b;
          int c;
      };
      
      struct NumbersArray{
          int size;
          Numbers **numbers;
      };
      int main(){
          NumbersArray numArr;
          numArr.size = 10;
          numArr.numbers = new Numbers* [10];
          for(int i = 0; i < 10; i++){
              Numbers *num = new Numbers;
              num->a = i * 3 + 0;
              num->b = i * 3 + 1;
              num->c = i * 3 + 2;
              numArr.numbers[i] = num;
          }
      }   
      

      【讨论】:

      • 虽然这段代码可以编译,但它不是一个好的解决方案。这会将所有 10 个 Numbers 对象分配到单独的堆块中。 OP 的原始代码将为所有 10 个对象分配一块内存,除非有理由不这样做,否则这是可取的。
      【解决方案5】:

      这是错误消息的重要部分:

      error: no match for ‘operator=’ (operand types are ‘Numbers’ and ‘Numbers*’)
      

      您正在尝试将指向 Numbers 的指针分配给 Numbers 值。错误消息的其余部分没有帮助。

      假设您不想像所有其他答案所暗示的那样更改 NumbersArray 类,您的内部循环应该如下所示:

      for(int i = 0; i < 10; i++){
          Numbers num;
          num.a = i * 3 + 0;
          num.b = i * 3 + 1;
          num.c = i * 3 + 2;
          numArr.numbers[i] = num;
      }
      

      了解 C++ 中的值和指针。

      【讨论】:

        猜你喜欢
        • 2011-12-08
        • 2019-05-26
        • 2015-09-02
        • 2018-05-23
        • 2011-12-10
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多