将元素添加到遇到的结构数组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&’
此处忽略内存管理。
你在练习错误的东西,你只会用这种方法改掉坏习惯。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
型,而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;
}
如何向数组中添加元素
你不能。
当您说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;
}
相关文章:
- 错误消息:使用"string* +="后"no match for 'operator+='"
- 在 Eclipse: "error: no match for 'operator='" 中获取错误消息
- 如何'Invalid conversion'和'no match for operator'更正这些 c++ 错误
- 为什么当我没有变量或其他任何命名的东西时"no match for 'operator==' "错误?
- 如何修复以下错误"no match for call to '(std::tr1::shared_ptr<_iobuf*>) (FILE*&)'"
- 为什么我收到以下错误:"no match for 'operator=='"?(带模板的嵌套类)
- 在命名空间内的类中使用带有运算符重载的字符串流时"no match for ‘operator>>’"
- 提升::访客操作员过载的变体"Error: no match for call to [...]"
- 如何修复C++中的"no match for operator+"?
- 运算符重载错误"no match for operator error"
- 引入 std::enable_if 后出现"No match"错误
- "No match for operator []"
- 如果我没有重载,为什么我会"no match for ‘operator=’"自定义类?
- 为什么编译器显示错误"no match for 'operator[]' (operand types are 'carti' and 'int')"
- 对简单的帐户检查程序有问题?程序返回编译错误,指出"no match for 'operator||' unsure of how to fix?"
- "no match for 'operator >>'"代码中是什么意思?
- 如何将对象分配到2D矢量no Match oterator =
- "no match for ‘operator>>’ in ‘inputFile >> buffer"错误?
- 如何修复" no match for 'operator<<' in 'std::cout"错误?
- 简单迭代器差异的"No match for operator-"错误