类中类如何给构造函数传递初始化参数

z1z2z3z4 2012-10-18 11:49:11
class A{
int a1;
int a2;
A(int input1, int input2):a1(input1), a2(input2){}
}

class B{
int b1;
A a;
B(int input1):b1(input1){}
}

int main(){
B b(100);//初始化时如何传递参数给A的构造函数
}
...全文
632 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sun-Flower 2012-10-19
  • 打赏
  • 举报
回复
依据楼主的程序,应该是关于“成员对象和构造函数”的问题吧。

成员对象即:使用其他类的对象最为该类的成员;使用成员对象的技术成为聚合。
具体说明:
#include<iostream>
using namespace std;
class A{
private:
int a1;
int a2;
public:
A(int input1, int input2):a1(input1), a2(input2){}
};

class B{
private:
int b1;
A a;
public:
B(int input1,int input2,int input3):a(input1,input2),b1(input3){}
};
int main(){
B b(100,200,300);//初始化时如何传递参数给A的构造函数
return 0;
}

从主函数入口,类B定义一个对象b1,b1要调用构造函数,因为B类有A类的对象作为成员,所以要先调用A类的构造函数,(虽然类A没有写构造函数,但系统会自动调用它的构造函数),然后再调用B类的构造函数

注意:各成员对象的构造函数的调用次序与类定义中说明的顺序一致,而与它们在构造函数成员初始化列表中 的顺序无关
如: B(int input1,int input2,int input3):b1(input1),a(input2,input3){}
和上面的调用构造函数的顺序一样

不知道有没有解决你的问题。
z1z2z3z4 2012-10-19
  • 打赏
  • 举报
回复
2楼的办法可以。由于B类在项目大量使用,不方便修改初始化参数,最后采用的办法还是在A类添加默认构造函数,在B类的构造函数中执行A类的带参数构造函数。
z1z2z3z4 2012-10-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

C/C++ code

class A
{
int a1;
int a2;

public:
A(int input1, int input2):a1(input1), a2(input2){}
};

class B
{
int b1;
A a;

public:
B(int input1, int input2, int input3):b1……
[/Quote]
提示没有合适的默认构造函数,是不是应该在A类中添加
A(){}作为默认构造函数?
最好是不用提供这个,直接用带参数的构造函数完成初始化。
zhuyf87 2012-10-18
  • 打赏
  • 举报
回复

class A
{
int a1;
int a2;

public:
A(int input1, int input2):a1(input1), a2(input2){}
};

class B
{
int b1;
A a;

public:
B(int input1, int input2, int input3):b1(input1), a(input2, input3){}
};

int main(int argc, char* argv[])
{
B b(100, 200, 300);

return 0;
}
图灵狗 2012-10-18
  • 打赏
  • 举报
回复
通过B的构造函数间接传给A,比如:
B(int input1, int input2)
{
a.a1 = input1;
a.a2 = input2;
b1 = input1;
}
江南小鱼 2012-10-18
  • 打赏
  • 举报
回复
方法很多:
比如B继承A,可以构造函数初始化A的数据成员;
再比如在A中定义setx成员函数,然后在B中赋值;
再比如在B中定义友元函数...
江南小鱼 2012-10-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
通过B的构造函数间接传给A,比如:
B(int input1, int input2)
{
a.a1 = input1;
a.a2 = input2;
b1 = input1;
}
[/Quote]
大哥,a1、a2是私有成员,你可以直接a.a1?
江南小鱼 2012-10-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
C/C++ code

class A
{
int a1;
int a2;

public:
A(int input1, int input2):a1(input1), a2(input2){}
};

class B
{
int b1;
A a;

public:
B(int input1, int input2,……
[/Quote]
A不是B的基类,你可以通过B的构造函数实例化A?

为了验证你的方法,在类A增加两个成员函数
int Geta(){return a1;}
int Getb(){return a2;}
在类B增加成员函数
void display(){cout<<a.Getb()<<","<<a.Geta()<<","<<b1<<endl;}

然后在main函数增加
b.display();

是得不到结果的。
zhuyf87 2012-10-18
  • 打赏
  • 举报
回复
回3楼,在我这正常。你把我的代码整体复制过去试一下。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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