将元素添加到遇到的结构数组C++"error no match for ‘operator=’"

add element to array of struct in C++ encountered "error no match for ‘operator=’"

本文关键字:match no error for operator C++ 添加 元素 遇到 数组 结构      更新时间:2023-10-16

我的代码是

#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++在值语义上茁壮成长,注意:

#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;
    }
}

应该是(忽略您的内存管理):

numArr.numbers[i] = *num;

代替

numArr.numbers[i] = num;

因为numArr.numbers[i]Numbers型,而numNumbers*型。

编辑:

错误实际上告诉您没有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;
}

如何向数组中添加元素

你不能。

当您说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会在需要的时候调整自己的大小。

试试下面的代码。你试图将一个对象的指针赋值给对象本身。

#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;
    }
}   

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

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;
}