c++中在一个类中定义另一个只有带参数构造函数的类的对象,编译通不过

[复制链接]
查看11 | 回复4 | 2010-6-8 18:45:53 | 显示全部楼层 |阅读模式
#include
using namespace std;
class A
{
public:
A(int i){}
};
class B
{
public:
B(){}
private:
//A a; //这里当然通不过,没有可用的构造函数
A a(5); //但是这里也编译通不过,编译器居然把此语句当成一个定义一个函数A a()了,郁闷!
};
void main()
{
B b;
}
我现在想在B类的数据成员中定义A类的对象,但是A类中只有带参数的构造函数,请问如何解决?

回复

使用道具 举报

千问 | 2010-6-8 18:45:53 | 显示全部楼层
在B中定义 A a; 是可以通过的,但在其他地方(比如函数中)这样是不对的。在B中定义 A a; 只是告诉编译器:“B有一个A类的对象”,并不在定义的时候创建a这个对象成员,也就不考虑它的构造函数。a这个对象成员的创建是在执行B的构造函数时进行的,B的构造函数后面必须以初始化表的形式为a对象成员提供参数,比如B( ) : a( 1 ) { }如果在构造函数中不为a提供参数,会发生错误。在其他地方(比如函数中)定义A的对象时,必须定义成 A a(参数);的形式。因为定义时就要创建A的对象,所以要考虑它的构造函数。你的程序出现错误不是因为在B中定义 A a;引起的。是因为:1、你定义了A a(5)。这是不行的
回复

使用道具 举报

千问 | 2010-6-8 18:45:53 | 显示全部楼层
这是典型的对象成员的例子,该成员应使用初始化列表初始化。如下再创建构造函数时使用初始化列表比如class B{A a;B():a(5){}}类中的对象成员:即把对象作为另一个类的成员。比如class hyong1{public: hyong x;},这时如果声明了一个hyong1的对象则调用hyong的默认构造函数初始化对象x
回复

使用道具 举报

千问 | 2010-6-8 18:45:53 | 显示全部楼层
#includeusing namespace std;class A{public: A(int i){}};class B{public: B():a(5)//构造函数初始化子对象 { }private: //A a; //这里当然通不过,没有可用的构造函数 A a;
回复

使用道具 举报

千问 | 2010-6-8 18:45:53 | 显示全部楼层
A a(5); //但是这里也编译通不过,编译器居然把此语句当成一个定义一个函数A a()了这里通不过很正常,有歧义的感觉:1.定义一个A的对象,调用构造函数初始化,但初始化并不是放这里,所以编译器不会这样解释。2.定义函数。定义A的指针吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行