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类中只有带参数的构造函数,请问如何解决? 展开
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类中只有带参数的构造函数,请问如何解决? 展开
4个回答
展开全部
在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;
}
在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;
}
展开全部
这是典型的对象成员的例子,该成员应使用初始化列表初始化。如下
再创建构造函数时使用初始化列表
比如
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指针及与类有关的各种运算符》
再创建构造函数时使用初始化列表
比如
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指针及与类有关的各种运算符》
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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;
}
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;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
A a(5); //但是这里也编译通不过,编译器居然把此语句当成一个定义一个函数A a()了
这里通不过很正常,有歧义的感觉:
1.定义一个A的对象,调用构造函数初始化,但初始化并不是放这里,所以编译器不会这样解释。
2.定义函数。
定义A的指针吧
这里通不过很正常,有歧义的感觉:
1.定义一个A的对象,调用构造函数初始化,但初始化并不是放这里,所以编译器不会这样解释。
2.定义函数。
定义A的指针吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询