我有A班和B班。 B是A的成员。 我需要用A的其他数据成员初始化B.
class A;
class B
{
public:
B(A& a){cout << "B constr is run \n";}
};
class A
{
public:
A(){}
void initB(A& a){b(a); cout << "A call init B \n"; }
private:
// other members ...
B b;
};
int main()
{
A a;
a.initB(a);
}
我收到了编译错误:
classIns.cpp: In constructor âA::A()â:
classIns.cpp:14: error: no matching function for call to âB::B()â
classIns.cpp:8: note: candidates are: B::B(A&)
classIns.cpp:6: note: B::B(const B&)
classIns.cpp: In member function âvoid A::initB(A&)â:
classIns.cpp:16: error: no match for call to â(B) (A&)â
为什么A(){}需要调用B :: B()?
如何用A的其他数据成员初始化B?
感谢
答案 0 :(得分:4)
B
没有默认构造函数,这意味着有在A
的ctor中初始化它。
struct A {
A() : b(*this) {}
private:
B b;
};
任何时候你想到使用init
- 像成员一样,你可能做错了。构造函数完成后,对象应始终有效。
答案 1 :(得分:1)
像这样:
void initB(A& a){
b = B(a);
cout << "A call init B \n";
}
当然,B类需要一个默认构造函数,以及一个引用A类对象的复制构造函数。
答案 2 :(得分:1)
您可以在A构造函数中使用初始化链:
class B
{
public:
B(Type1 x, Type2 y)
{
}
void init(Type1 x, Type2 y) { ........}
};
class A
{
public:
A() : Amember1(), Amember2(), b(Amember1, Amember2) {}
private:
Type1 Amember1;
.....
B b;
};
但是你不能在initB
方法中调用B构造函数,因为已经构造了b。
您可以将B::init()
方法与A数据一起使用,例如:
void A::initB(A& a){ b.init(a.Amember1, a.Amember2); cout << "A call init B \n"; }
答案 3 :(得分:0)
为什么A(){}需要调用B :: B()?
因为A有一个数据成员B,在创建A类的实例时需要对其进行初始化。在你的情况下,b用默认的B c'tor初始化。
因为您正在为B
指定构造函数public:
B(A& a){cout << "B constr is run \n";}
默认构造函数:
B(){}
不是由编译器自动生成的。所以它抱怨。