我应该如何重载C++中的运算符+

How am I supposed to overload the operator + in C++

本文关键字:C++ 运算符 重载 何重载 我应该      更新时间:2023-10-16

我应该重载运算符+来添加两个小队,这两个小队将返回一个新的小队,其成员数是两个小队成员数的总和,其他属性取自成员数较多的小队。我正在尝试,但结果毫无意义!我不知道错误是在我重载+运算符的部分,还是在显示哪个巡演拥有最多成员的函数中?!

以下是所有练习的内容:"山地队问题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 []。然而,我让你来解决这些问题。

您是否尝试使用调试器?

或者,更好的方法是,在纸上解决你的问题,然后将其翻译成代码。