我有以下课程:
class BandMember
{
private:
char *name;
int age;
int relationshipStatus;
char *musicianType;
public:
//functions
void setName(char* name1);
char * getName() const;
void setAge(int age1);
int getAge() const;
void setRelationshipStatus(int status);
int getRelationshipStatus() const;
void setMusicianType(char* job);
char* getMusicianType() const;
BandMember* readBandMember();
//print
void print();
//constructor
BandMember(const char *nameToAdd = "no name", const int ageToAdd = 0,
const int relationshipStatusToAdd = 0,
const char *musicianTypeToAdd = "no music type");
//destructor
~BandMember() { delete[] name; delete[] musicianType;}
//copy constructor
BandMember(const BandMember& bandMember);
};
在BandMember* BandMember::readMember
中的代码是:
BandMember* BandMember::readBandMember()
{
char *nameNewMember, *musicTypeNewMember;
int ageNewMember, familyStatusNewMember;
nameNewMember = new char[NAME_LENGTH];
musicTypeNewMember = new char[NAME_LENGTH];
cin.ignore(10,'\n');
cout << "Enter band member name: "; //askName() - TODO
cin.getline(nameNewMember, NAME_LENGTH);
reallocate(nameNewMember, strlen(nameNewMember));
cout << "enter the age of the band member: "; //askAge - TODO
cin >> ageNewMember;
cin.ignore(10,'\n');
cout << "enter musician type: "; //askMusicianType - TODO
cin.getline(musicTypeNewMember, NAME_LENGTH);
reallocate(musicTypeNewMember, strlen(musicTypeNewMember));
return new BandMember(nameNewMember, ageNewMember,,musicTypeNewMember);
问题出在返回值上。
编译器说“缺少表达式,重载+1”:
但是当我放return new BandMember(nameNewMember, ageNewMember,0,musicTypeNewMember);
时
该代码工作正常...
我不明白为什么。
我用默认值定义了一个默认承包商,所以为什么当我返回一个缺少值时它不起作用?
答案 0 :(得分:3)
似乎您误解了默认参数在C ++中的工作方式...
您不能 skip 参数并将其作为默认值。如果要提供后面的参数,则需要在其前面提供 all 参数。
因此,带有双逗号的BandMember(nameNewMember, ageNewMember,,musicTypeNewMember)
不正确,您还必须提供relationshipStatusToAdd
参数:
return new BandMember(nameNewMember, ageNewMember,0,musicTypeNewMember);
// ^
// Added argument here --------------------------/
答案 1 :(得分:1)
我用默认值定义了一个默认承包商,所以为什么当我返回缺少值时它不起作用?
参数的默认值仅从右开始适用。您不能在中间遗漏一个。
new BandMember(nameNewMember, ageNewMember,,musicTypeNewMember);
// ^ NOPE!
例如,您可以这样称呼它
new BandMember(nameNewMember, ageNewMember);
如果要让构造函数只接受前两个参数和最后一个参数的参数,则需要编写一个在第一个出现的参数处的构造函数。
我不明白为什么
可能没有任何技术限制禁止这样做。您使用,,
的方式可能是一种可行的方式。但是,那不是在C ++中定义的方式。