我应该重载操作员+添加两个小队,这些小队将返回一个新小队,其成员数量是两个小队成员数量的总和,其他属性来自小队会员人数较多。我正在尝试但结果没有任何意义!而且我不知道错误是在我重载+运算符的部分,还是在函数中显示哪个巡视有大多数成员?!
以下是所有练习的内容:“山地小组问题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;
}
答案 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)
您是否尝试使用调试器?
或者,更好的是 - 在纸上解决您的问题 - 然后将其翻译成代码。