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

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

我的代码是

#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&’

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

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

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

how to add elements to the array

你不能。

当您说 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;
    }
}   

你在错误的事情上练习,你只会 以这种方式养成坏习惯。 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;
    }
}

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

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

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

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

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++ 中的值和指针。