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

#include<iostream>usingnamespacestd;classA{public:A(inti){}};classB{public:B(){}priva... #include<iostream>
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类中只有带参数的构造函数,请问如何解决?
展开
 我来答
wise_111
2010-06-08 · TA获得超过892个赞
知道小有建树答主
回答量:329
采纳率:0%
帮助的人:355万
展开全部
在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)。
这是不行的,因为此时并不创建A对象,不能为其提供参数。你说“编译器把此语句当成一个定义一个函数A a()”也是不对的。就是因为这时不能为a提供参数,一定要在B的构造函数中提供!

2、你的程序没有为B提供一个“可以为a提供参数”的构造函数。
这样你在主函数中定义B b的时候,就不能初始化它里面的a。

所以,你的代码应将这两个错误改过来,即写成如下:

class A
{
public:
A( int i ){}
};

class B
{
public:
B():a(1){} //或:B( int i ):a( i ){ }。对a提供参数一定要按
//这种形式,在冒号后,不能在花括号里面!
private:
A a;
};

void main()
{
B b;
}
黄邦勇帅哥哥
2010-05-31 · TA获得超过3987个赞
知道大有可为答主
回答量:1199
采纳率:100%
帮助的人:486万
展开全部
这是典型的对象成员的例子,该成员应使用初始化列表初始化。如下
再创建构造函数时使用初始化列表
比如
class B
{A a;
B():a(5){}
}

类中的对象成员:即把对象作为另一个类的成员。比如class hyong1{public: hyong x;},这时如果声明了一个hyong1的对象则调用hyong的默认构造函数初始化对象x,而不管hyong1的构造函数有没有初始化对象x,如果没有声明hyong1的对象,则不会初始化对象x。
2.如果要在用带有参数的构造函数初始化类中的对象成员,则对象成员必须在初始化列表中初始化。否则将发生错误。
3.如果在初始化列表中显式对hyong1的对象成员x初始化了,则用初始化列表的构造函数初始化对象x。不会再调用对象成员x的默认构造函数初始化对象x了。
4.如果再在hyong1的构造函数里对x重新赋值,即有语句x=hyong(),此语句不是对对象变量x初始化,而是对对象x重新赋值,将调用赋值操作符函数。

更多关于类中的各种成员(比如嵌套类等)的应用请下载本人的文章《C++类中的各种成员,嵌套类,友元,this指针及与类有关的各种运算符》
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
linzhonghou
推荐于2016-06-12 · TA获得超过274个赞
知道小有建树答主
回答量:143
采纳率:0%
帮助的人:152万
展开全部
#include<iostream>
using namespace std;

class A
{
public:
A(int i){}
};

class B
{
public:
B():a(5)//构造函数初始化子对象
{
}
private:
//A a; //这里当然通不过,没有可用的构造函数
A a; //但是这里也编译通不过,编译器居然把此语句当成一个定义一个函数A a()了,郁闷!
};

void main()
{
B b;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
堕落DE青蛙
2010-05-31 · TA获得超过108个赞
知道答主
回答量:90
采纳率:0%
帮助的人:99.7万
展开全部
A a(5); //但是这里也编译通不过,编译器居然把此语句当成一个定义一个函数A a()了

这里通不过很正常,有歧义的感觉:
1.定义一个A的对象,调用构造函数初始化,但初始化并不是放这里,所以编译器不会这样解释。
2.定义函数。

定义A的指针吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式