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?
undergraduate
是student
。所以构造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 提供默认构造函数。这会导致错误。
其次,您不需要指向父级的指针,除非您有任何其他特殊要求。
因此,您有两种不同的选择来解决问题。
- 为
student
提供默认构造函数。
- 或者在子构造函数(
undergraduate
)中初始化student
,去掉多余的指向student
的指针。
同样使用constructor member initializer list来初始化class的成员:
undergraduate(string firstname, string lastname, double gpa)
: student{ std::move(firstname), std::move(lastname)}
, gpa{ gpa}
{}
以下代码在继承方面有什么问题?收到 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?
undergraduate
是student
。所以构造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 提供默认构造函数。这会导致错误。
其次,您不需要指向父级的指针,除非您有任何其他特殊要求。
因此,您有两种不同的选择来解决问题。
- 为
student
提供默认构造函数。 - 或者在子构造函数(
undergraduate
)中初始化student
,去掉多余的指向student
的指针。
同样使用constructor member initializer list来初始化class的成员:
undergraduate(string firstname, string lastname, double gpa)
: student{ std::move(firstname), std::move(lastname)}
, gpa{ gpa}
{}