我应该如何重载C++中的运算符+
How am I supposed to overload the operator + in C++
我应该重载运算符+来添加两个小队,这两个小队将返回一个新的小队,其成员数是两个小队成员数的总和,其他属性取自成员数较多的小队。我正在尝试,但结果毫无意义!我不知道错误是在我重载+运算符的部分,还是在显示哪个巡演拥有最多成员的函数中?!
以下是所有练习的内容:"山地队问题2(0/30)
为山地小队编写一个类,保存小队名称(动态分配的字符数组)、旅行次数(整数)和成员数量(整数)的信息。对于此类实现:
•operator+用于添加两个小队,从而返回一个新小队,其成员数量为两个小队成员数量之和,其他属性取自成员数量较多的小队。
•运算符>,<用于通过成员数量进行比较
•操作员<lt;用于在SO.上打印信息
编写一个函数,接受山地小队的阵列和阵列的大小,并打印具有最大成员数的小队。"
#include <iostream>
#include <string.h>
using namespace std;
class MSquad{
private:
char *name;
int tours;
int members;
void copy(const MSquad &toCopy){
name = new char[strlen(toCopy.name) + 1];
strcpy(name, toCopy.name);
tours = toCopy.tours;
members = toCopy.members;
}
public:
MSquad(char *n = "unknown", int nT = 0, int nM = 0){
name = new char[strlen(n + 1)];
strcpy(name, n);
tours = nT;
members = nM;
}
MSquad(const MSquad &toCopy){
copy(toCopy);
}
~MSquad(){
delete [] name;
}
const MSquad &operator=(const MSquad &right){
if(&right != this){ // avoiding self- assignment
delete [] name;
copy(right);
}
return *this;
}
MSquad &operator+(const MSquad &right) const{
members = members + right.members;
if(right.members > members){
name = new char[strlen(right.name) + 1];
strcpy(name, right.name);
tours = right.tours;
//members = members + right.members;
}
return *this;
}
bool operator>(const MSquad &right){
return members > right.members;
}
bool operator<(const MSquad &right){
return members < right.members;
}
friend ostream &operator<<(ostream &output, const MSquad &right);
friend void mostMembers(MSquad *squads, int size);
};
ostream &operator<<(ostream &output, const MSquad &right){
output << "Name: " << right.name;
output << " Tours: " << right.tours;
output << " Members: " << right.members << endl;
return output;
}
void mostMembers(MSquad squads[], int size){
int max = squads[0].members;
int j = 0;
for(int i = 1; i < size; i++){
if(squads[i].members >= max){
max = squads[i].members;
j = i;
}
}
cout << "The max number of members is in squad in: " << squads[j] << endl;
}
int main()
{
MSquad squads[3];
MSquad s;
for (int i=0;i<3;i++)
{
char name[100];
int tours;
int members;
cin>>name;
cin>>tours;
cin>>members;
squads[i] = MSquad(name, tours, members);
}
s = squads[0] + squads[1];
cout<<s;
mostMembers(squads, 3);
return 0;
}
问题是您不了解operator +
应该返回什么。根据您的任务:
•操作员+用于添加两支队伍,这两支队伍将因此返回一支新队伍队员人数为两个小队,
在您的代码中,您将为operator +
返回一个MSquad&
。这是不正确的,因为您应该返回一个新的MSquad
对象,该对象由当前对象和传入的对象组成。
然而,一切都没有丢失,我们可以保留您现在拥有的代码。拯救我们的是,您已经编写了一个用户定义的复制构造函数和析构函数,因此我们可以应用一个简单的修复程序。
我们可以解决这个问题的方法是执行以下操作(这不在您的需求中,但让我们使用您现在拥有的代码):
MSquad &operator+=(const MSquad &right) const
{
members = members + right.members;
if(right.members > members){
name = new char[strlen(right.name) + 1];
strcpy(name, right.name);
tours = right.tours;
//members = members + right.members;
}
return *this;
}
MSquad operator+(const MSquad &right) const
{
MSquad temp(*this); // create a temporary copy of the current object
return temp += right; // use += above on passed-in object and return object.
}
我们已经获取了您现有的代码,使其成为operator+=
,并使用此函数创建了一个operator +
。所以我们一举两得。我们创建了一个operator +=
,它应该返回对当前对象的引用,并使用operator +=
作为辅助函数编写了operator +
。此外,请注意,我们利用复制构造函数创建了当前对象的临时对象。
通常,当您重载运算符(如+
)时,最好先重载op=
,然后从运算符op
调用它。
请注意,您的代码还有许多其他问题,包括指针管理不善和内存泄漏。例如,operator +
函数(现在是答案中的operator +=
)存在内存泄漏,因为您没有在之前的name
分配中delete []
。然而,我让你来解决这些问题。
您是否尝试使用调试器?
或者,更好的方法是,在纸上解决你的问题,然后将其翻译成代码。
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 如何防止clang格式在流运算符调用之间添加换行符<<