No matching function for call to ‘student::student()’ 错误

No matching function for call to ‘student::student()’ error

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

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();
}

请指出错误并帮助我改正。谢谢!

看起来您可能是一名 Python 程序员,所以这是您的代码,用该语言重新编写

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 是一个 ),因此不需要 undergraduate 中的成员。对于 C++ class.

也是一样的

但是,在 Python 代码中,undergraduate class 在 undergraduate 构造函数的主体中调用 student 构造函数。这与它在 C++ 中的工作方式不同。该语言使用“初始化列表”。这些不仅用于调用父构造函数,还用于初始化成员变量。

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();
}

如果您对继承的工作原理感到困惑,我强烈建议您找一本好书或教程。 SO 上的答案不够详细,无法完全解释这些概念。
The Definitive C++ Book Guide and List
Constructors and member initializer lists


RE 代码中的原始错误:编译器正在寻找 student 的默认构造函数(无参数),但您没有提供。参见:When do we need to have a default constructor?

undergraduatestudent。所以构造undergraduate需要先构造父classstudent.

既然你没有提供,如何在

中构造父student
 undergraduate(string firstname, string lastname, double gpa) 
 {
    stu = new student(firstname, lastname);
    this->gpa = gpa;
 }

在涉及构造函数体之前,编译器会尝试通过调用student的默认构造函数来为您完成。由于 student 有参数化构造函数 student(string fname, string lname),编译器不会为你生成一个,最终没有为 student 提供默认构造函数。这会导致错误。

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

因此,您有两种不同的选择来解决问题。

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

同样使用constructor member initializer list来初始化class的成员:

undergraduate(string firstname, string lastname, double gpa)
 :  student{ std::move(firstname), std::move(lastname)}
 ,  gpa{ gpa} 
 {}