请教一个关于构造函数的问题

mr_fanwei 2011-02-01 05:57:25
自己编译时,发现如下代码编译不过.
C2512. 如下是具体解释.
Error Message
'identifier' : no appropriate default constructor available
No default constructor is available for the specified class, structure, or union. The compiler supplies a default constructor if user-defined constructors are not provided.
If you provide a constructor that takes a non-void parameter, and you want to allow your class to be created with no parameters, you must also provide a default constructor. The default constructor can be a constructor with default values for all parameters.

class Foo
{
int tVar;
public:
Foo(int t) : tVar(t) { }
};
class FooDerived : public Foo{ };
int main(void)
{
FooDerived fd; //C2512
}

但是我修改后,编译通过. Foo(int t) : tVar(t) 这个不是父类的构造函数?
class Foo
{
int tVar;
public:
//Foo(int t) : tVar(t) { }
};

请问专家为什么? 多谢.
...全文
120 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
JsenLong 2011-02-04
  • 打赏
  • 举报
回复
一个子类的构造函数会调用父类的构造函数来初始化继承的成员。因为你在子类里没有自己写带参的构造函数,它会自动生成一个无参的构造函数,而你的父类的构造函数是带参的,出错了。
wenjinghuan999 2011-02-02
  • 打赏
  • 举报
回复
没有默认构造函数,所以FooDerived找不到默认构造函数啦……
skinnymonkey 2011-02-02
  • 打赏
  • 举报
回复
(1)如果你不提供任何构造函数,编译器会自动为你提供一个不带参数的构造函数。

(2)如果你提供了构造函数,编译器什么也不做。你定义初始化变量的时候只能通过自己定义的构造函数。

改之前,只能通过带参数的构造函数定义变量(参见2)。
注释掉以后,可以通过编译器提供的不带参数的默认构造函数初始化变量(参见1)。
modaoshi3002 2011-02-02
  • 打赏
  • 举报
回复
你可以手动再为类提供一个不带参数的构造函数。

class Foo
{
int tVar;
public:
Foo(int t): tVar(t){} //冒号后面不是父类的构造函数,这个是初始化列表,
//你可以在这里调用父类的构造函数,也可以初始化类的数据成员。
Foo(void):tVar(0){}
};
class FooDerived : public Foo{ };
int main(void)
{
FooDerived fd; //此时就ok了。
}

modaoshi3002 2011-02-02
  • 打赏
  • 举报
回复
在一个自定义类中,如果我们不为它提供构造函数,那么编译器是会给于类一个不带参数的默认构造函数的。
但如果我们自定义了一个构造函数,那么编译器就不提供默认构造函数了。

你在main中,使用了FooDerived fd;
意思是调用这个类的不带参数的构造函数,就是调用默认构造函数。
而你已经有过自定义构造函数,所以这个类已经没有不带参数的默认构造函数了。
肯定要出错。

而当你注释掉了你自己的构造函数,此时类没有构造函数,编译器就会再给予它一个默认的。
所以你的程序又编译通过了。
jixingzhong 2011-02-01
  • 打赏
  • 举报
回复
提供一个带默认参数的构造函数。
pengzhixi 2011-02-01
  • 打赏
  • 举报
回复
你这个问题在于,你基类提供了一个含参数的构造函数,所以编译器不再提供默认构造函数,而你的派生类的构造函数没办法调用基类的默认构造函数。
解决办法有2种,1. 为基类提供默认构造函数。2. 派生构造函数提供一个参数给基类构造函数。
wr901026 2011-02-01
  • 打赏
  • 举报
回复
你的构造函数是一个带参数的构造函数,而你在定义时FooDerived fd;却没有参数。所以会报错。本来系统会默认一个Foo(){ }构造函数,但是你自己定义了一个构造函数,所以会把默认的覆盖掉,如果你想让FooDerived fd;不会报错,那就在加上Foo(){ },这样就应该没问题了。
arong1234 2011-02-01
  • 打赏
  • 举报
回复
所谓default contructor就是说一个不带参数的构造函数
对于FooDerived类,它构造时必须构造其基类,而基类构造函数只有一个带整数参数的实例。你的FooDerived没有办法不带参数去构造Foo类

64,647

社区成员

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

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