我怎么能在C ++中重载operator +

时间:2016-03-23 18:39:03

标签: c++ operator-overloading

我应该重载操作员+添加两个小队,这些小队将返回一个新小队,其成员数量是两个小队成员数量的总和,其他属性来自小队会员人数较多。我正在尝试但结果没有任何意义!而且我不知道错误是在我重载+运算符的部分,还是在函数中显示哪个巡视有大多数成员?!

以下是所有练习的内容:“山地小组问题2(0/30)

为山地小队写一个班级,保存小队名称的信息(动态分配的队列数量),游览数量(整数)和成员数量(整数)。对于这个类实现:

•operator +用于添加两个小队,这些小队将返回一个新小队,其成员数量是两个小队成员数量的总和,而其他属性则来自拥有更多成员数量的小队。 / p>

•运营商>,<按成员数量进行比较

•operator<<用于在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;
}

2 个答案:

答案 0 :(得分:0)

问题在于你不了解operator +应该返回的内容。根据你的任务:

  

•operator +用于添加两个小队,这些小队将返回一个新的小队   成员数量的小队,是成员数量的总和   两个小队,

在您的代码中,您为MSquad&返回operator +。这是不正确的,因为您应该返回一个由当前对象和传入对象组成的新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 +=)内存泄漏,因为您没有delete []之前的name分配。但是,我会由你来解决这些问题。

答案 1 :(得分:-6)

您是否尝试使用调试器?

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