向 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
类型,而 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;
}
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++ 中的值和指针。
我的代码是
#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
类型,而 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;
}
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++ 中的值和指针。