如何使用此类的其他成员数据初始化类成员数据?

时间:2011-10-29 17:02:06

标签: c++ class object constructor

我有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?

感谢

4 个答案:

答案 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(){}

不是由编译器自动生成的。所以它抱怨。