构造函数中缺少表达式

问题描述 投票:0回答:2

我有以下课程:

  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);该代码工作正常...我不明白为什么。我用默认值定义了一个默认承包商,所以当我返回一个缺少值时为什么它不起作用?

c++ default-constructor
2个回答
3
投票

似乎您误解了默认参数在C ++中的工作方式...

您不能skip自变量,并将其作为默认值。如果要提供后面的参数,则需要在其前面提供all参数。

因此带有双逗号的BandMember(nameNewMember, ageNewMember,,musicTypeNewMember)不正确,您还必须提供relationshipStatusToAdd参数:

return new BandMember(nameNewMember, ageNewMember,0,musicTypeNewMember);
//                                                ^
// Added argument here --------------------------/

1
投票

我用默认值定义了一个默认承包商,所以当我返回一个缺少值时为什么它不起作用?

参数的默认值仅从右开始适用。您不能在中间遗漏一个。

new BandMember(nameNewMember, ageNewMember,,musicTypeNewMember);
                                 //        ^  NOPE!

例如,您可以这样称呼它

new BandMember(nameNewMember, ageNewMember);

如果您希望构造函数只接受前两个参数和最后一个参数的参数,那么您需要编写一个在第一个出现的参数的构造函数。

我不明白为什么

可能没有技术限制可以禁止这种情况。您使用,,的方式可能是可行的方式。但是,那不是在C ++中定义的方式。

© www.soinside.com 2019 - 2024. All rights reserved.