C++入门阶段,关于子类实现自己构造函数时遇到的问题,求解。。。

浪2013 2013-10-27 08:58:04
我每次写关于继承的程序时,都会有这个错误,我真心想知道怎么回事,求解。。。。
class Person
{
public:
Person(string name);
void introduce();
protected:
string name;
};
class Teacher:public Person
{
public:
Teacher(string tname,string classes);
void introduce();
void teach();
protected:
string classes;
};
Person::Person(string p)
{
name=p;
}
void Person::introduce()
{
cout<<"My name is "<<name<<",Thankyou!"<<endl;
}
Teacher::Teacher(string t,string c)
{

classes=c;
}
void Teacher::teach()
{
cout<<"I teach "<<classes<<endl;
}
void Teacher::introduce()
{
cout<<"My name is "<<name<<", I teach"<<classes<<endl;
}
int main()
{

return 0;
}
error C2512: 'Person' : no appropriate default constructor available
error C2512: 'Person' : no appropriate default constructor available
error C2512: 'Teacher' : no appropriate default constructor available

...全文
231 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
buyong 2013-10-28
  • 打赏
  • 举报
回复
看看你创建Person时,加没加参数
To_be_sky 2013-10-28
  • 打赏
  • 举报
回复
你这个子类继承父类,在实现子类构造函数时,要初始化父类的成员变量。 这个只能在子类的构造函数的初始化列表中初始化。
SmallCoder1992 2013-10-28
  • 打赏
  • 举报
回复
default函数也就是默认构造函数,如果你在基类中没有定义的话,那么在继承类中你必须要用成员初始化列表对基类中成员进行初始化,否则你的基类无法进行初始化(这里也要考虑继承类的对象的构造过程,你想如果你做房子没有打地基能做好吗?除非你已经有了一个,也就是这里的默认构造函数,那么你就可以不用了,就可以直接进行做房子了,这只是一个比喻),所以你也可以在基类中提供一个默认构造函数(你可以想想默认构造函数在什么时候必须自己编写,什么时候自动形成)
凌典 2013-10-28
  • 打赏
  • 举报
回复
#include<iostream>
#include<cstring>
using namespace std;
class Person{
public:
	Person();
	virtual ~Person(){};
	Person(string name);
	virtual void introduce();
protected:
	string name;
};
class Teacher:public Person{
public:
	Teacher();
	virtual ~Teacher(){};
	Teacher(string tname,string classes);
	virtual void introduce();
	void teach();
protected:
	string classes;
};
Person::Person(string p){
	name=p;
}
void Person::introduce(){
	cout<<"my name is"<<name<<",thank you!"<<endl;
}
Teacher::Teacher(string t,string c):Person(t){
	classes=c;
}
void Teacher::teach(){
	cout<<"i teach"<<classes<<endl;
}
void Teacher::introduce(){
	cout<<"my name is "<<name<<",i teach"<<classes<<endl;
}
int main(){
	return 0;
}
重载运算符错误 还有,如果定义了一个构造函数(不是复制构造函数),该构造函数具有一个或者多个参数,那么编译器会生成复制构造函数
浪2013 2013-10-28
  • 打赏
  • 举报
回复
这样改编译时没有错误,连接的时候出错了
mujiok2003 2013-10-28
  • 打赏
  • 举报
回复
引用 9 楼 canglang1986 的回复:
哎呀妈呀,我在Teacher::Teacher(string t,string c)里加上name=t结果就对了,一定要这样改吗,还有别的办法吗?
#include <string>
#include <iostream>
using namespace std; 

class Person
{
public:
	Person(string name);
	void introduce();
protected:
	string name;
};
class Teacher:public Person
{
public:
	Teacher(string tname,string classes);
	void introduce();
	void teach();
protected:
	string classes;
};
Person::Person(string p)
{
	name=p;
}
void Person::introduce()
{
	cout<<"My name is "<<name<<",Thankyou!"<<endl;
}
//Teacher::Teacher(string t,string c) 
Teacher::Teacher(string t,string c) : Person(t)
{
	
	classes=c;
}
void Teacher::teach()
{
	cout<<"I teach "<<classes<<endl;
}
void Teacher::introduce()
{
	cout<<"My name is "<<name<<", I teach"<<classes<<endl;
}
int main()
{
	
	return 0;
}
mujiok2003 2013-10-28
  • 打赏
  • 举报
回复
引用 9 楼 canglang1986 的回复:
哎呀妈呀,我在Teacher::Teacher(string t,string c)里加上name=t结果就对了,一定要这样改吗,还有别的办法吗?
#include <string> #include <iostream> using namespace std; class Person { public: Person(string name); void introduce(); protected: string name; }; class Teacher:public Person { public: Teacher(string tname,string classes); void introduce(); void teach(); protected: string classes; }; Person::Person(string p) { name=p; } void Person::introduce() { cout<<"My name is "<<name<<",Thankyou!"<<endl; } Teacher::Teacher(string t,string c) : Person(t) { classes=c; } void Teacher::teach() { cout<<"I teach "<<classes<<endl; } void Teacher::introduce() { cout<<"My name is "<<name<<", I teach"<<classes<<endl; } int main() { return 0; }
浪2013 2013-10-28
  • 打赏
  • 举报
回复
我看的那个视频,老师的例子程序是这么写的
Teacher::Teacher(string t,string c):Person(string p)
{
classes=c;
}我在VC里这么写就不对,就只能是把冒号后面的去掉,之后大括号里加上name=c才行,到底哪个是对的呢
浪2013 2013-10-28
  • 打赏
  • 举报
回复
哎呀妈呀,我在Teacher::Teacher(string t,string c)里加上name=t结果就对了,一定要这样改吗,还有别的办法吗?
浪2013 2013-10-28
  • 打赏
  • 举报
回复
Teacher类继承了Person类,那Teacher类就不用再定义name变量了吧,因为父类中有这个变量。那我定义
Teacher teacher("zhang”,"Math")时,怎么能把这个名字赋给从父类那继承来的name变量?我加上无参构造函数Person(),Teacher(),实现部分:Person(){};Teacher(){};之后我在main()里定义
Person person("zhang");
person.introduce();

Teacher teacher("Wang","Math");
teacher.introduce();
teacher.teach();
运行结果:My name is zhang,Thankyou!//这个正确。
My name is,I teach Math//这个是错的,name变量没有赋值
I teach Math
我想说怎么才能自动调用父类带参的构造函数,把name变量赋上值,而不是在之类中重新赋值?
我表达清楚没,这个能实现吗,还是必须得在之类中赋值?

lm_whales 2013-10-27
  • 打赏
  • 举报
回复
你可以这么处理:
class Person
{
public:
    Person(string name);
    void introduce();
protected:
    string name;
};
class Teacher:public Person
{
public:
    Teacher(string tname,string classes);
    void introduce();
    void teach();
protected:
    string classes;
};
Person::Person(string p)
{
    name=p;
}
void Person::introduce()
{
    cout<<"My name is "<<name<<",Thankyou!"<<endl;
}
Teacher::Teacher(string t,string c):Person(t)
{
     
    classes=c;
}
void Teacher::teach()
{
    cout<<"I teach "<<classes<<endl;
}
void Teacher::introduce()
{
    cout<<"My name is "<<name<<", I teach"<<classes<<endl;
}
int main()
{
          
    return 0;
}
你的类,没有提供默认的构造函数,子类对象构造时,无法构造其中的父类子对象。 解决方法是 1)提供默认的构造函数 。 1.1)直接添加一个默认的构造函数 。 1.2)带参数的构造函数提供参数的默认值。(某个构造函数全部参数都有默认值) 例如 Person(string name=""); 2)子类在初始化表里,初始化父类对象。
max_min_ 2013-10-27
  • 打赏
  • 举报
回复
构造子类对象的时候,必须要先调用父类的构造函数构造父类! 你的父类构造函数中,只提供了带参的构造函数,所以不再默认构造函数! 所以 方法如下: 添加一个无参构造 或者删掉有参构造!~
  • 打赏
  • 举报
回复
当你提供一个带参的构造函数,那怕是拷贝构造函数,编译器再也不会给你提供默认构造函数了.Teacher继承于Person,你没有显示的初始化Person,那么就要调用其默认构造函数.然而,你没有提供,编译器也不提供,原因如上述.所以才导致这样的错误. 解决方法,就是楼上的
worldy 2013-10-27
  • 打赏
  • 举报
回复
加上 Person(){};

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧