首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有匹配函数调用‘学生::学生()’错误

没有匹配函数调用‘学生::学生()’错误
EN

Stack Overflow用户
提问于 2021-09-10 12:22:18
回答 2查看 212关注 0票数 0

下面的代码在继承方面有什么问题?获取no matching function for call to ‘student::student()’错误。

代码语言:javascript
复制
class student {
 private:
  string firstname;
  string lastname;

 public:
  student(string fname, string lname) {
    firstname = fname;
    lastname = lname;
  }
  string getname() { return firstname + lastname; }
  void setfirstname(string fname) { this->firstname = fname; }
};

class undergraduate : public student {
 private:
  double gpa;
  student* stu;

 public:
  undergraduate(string firstname, string lastname, double gpa) {
    stu = new student(firstname, lastname);
    this->gpa = gpa;
  }
};

int main() {
  undergraduate stu1("Sam", "Singh", 4.0);
  stu1.setfirstname("temp");
  cout << stu1.getname();
}

请指出错误,并帮助我纠正它。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-10 13:17:26

看起来您可能是个Python程序员,下面是您的代码,用这个语言重新编写。

代码语言:javascript
复制
class student:
    def __init__(self, fname, lname):
        self.firstname = fname;
        self.lastname = lname;

    @property
    def name(self):
        return self.firstname + self.lastname

class undergraduate(student):
    def __init__(self, fname, lname, gpa):
        super().__init__(fname, lname)
        self.gpa = gpa
 
stu1 = undergraduate("Sam", "Singh", 4.0);
stu1.firstname = "temp";
print(stu1.name)

首先要注意的是,undergraduate不包含student成员。由于它是从student (is a)继承的,所以不需要undergraduate中的成员。对于C++类来说是一样的。

但是,在Python代码中,undergraduate类调用undergraduate ctor主体中的undergraduate ctor。这与C++中的工作方式不同。该语言使用“初始化程序列表”。它们不仅用于调用父ctors,而且用于初始化成员变量。

代码语言:javascript
复制
class student {
 private:   // You may want to change to protected so child classes can access
  string firstname;
  string lastname;

 public:
  student(string fname, string lname) {
    firstname = fname;
    lastname = lname;
  }
  string getname() { return firstname + lastname; }
  void setfirstname(string fname) { this->firstname = fname; }
};

class undergraduate : public student {
 private:
  double gpa;
 
 public:
  undergraduate(string firstname, string lastname, double gpa) :
    student(firstname, lastname),  // Call parent ctor
    gpa(gpa)                       // Initialize this->gpa to gpa parameter
  {
      // The initializer list has taken care of everything so there's nothing here
      // But additional code could be added if needed.
  }
};

int main() {
  undergraduate stu1("Sam", "Singh", 4.0);
  stu1.setfirstname("temp");
  cout << stu1.getname();
}

如果您对继承的工作方式感到困惑,我强烈建议您找到一本好书或教程。因此,答案不足以充分解释这些概念。

权威的C++书籍指南和列表

构造函数和成员初始化程序列表

关于代码中的原始错误:编译器正在为student寻找默认的ctor (没有参数),但您没有提供参数。请参阅:我们什么时候需要一个默认的构造函数?

票数 3
EN

Stack Overflow用户

发布于 2021-09-10 13:24:21

undergraduate 是一个 student。因此,undergraduate的构造首先需要构造父类student

由于您没有提供,所以如何在

代码语言:javascript
复制
 undergraduate(string firstname, string lastname, double gpa) 
 {
    stu = new student(firstname, lastname);
    this->gpa = gpa;
 }

在讨论构造函数体之前,编译器将尝试通过调用student的默认构造函数来完成它。由于学生有参数化构造函数student(string fname, string lname),编译器将不会为您生成参数化构造函数,最终不会为学生生成默认构造函数。这会导致错误。

其次,除非有任何其他特殊要求,否则不需要指向父级的指针。

因此,您有两个不同的选项来解决这个问题。

  1. student提供默认构造函数。
  2. 或在子构造函数(undergraduate)中初始化undergraduate,删除指向student的冗余指针。

还可以使用构造函数成员初始化程序列表初始化类的成员:

代码语言:javascript
复制
undergraduate(string firstname, string lastname, double gpa)
 :  student{ std::move(firstname), std::move(lastname)}
 ,  gpa{ gpa} 
 {}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69132133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档