如何在C ++中声明自定义类型的成员对象并在之后进行初始化?

时间:2017-08-18 21:03:20

标签: c++ object types initialization member

以下代码在cpp.sh运行时有效:

#include <iostream>

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

B::B(int i) {
    this->i = i;
}

class A{
    public:
        A(B *b);
        B *b;
};

A::A(B *b) {
    this->b = b;
}


int main()
{
  B b(8);
  A a(&b);
  std::cout << a.b->i;
}

它创建一个类型为B的对象,并将指针存储在类型为A的对象中。 我想要做的是只传递整数(在本例中为8)并在a中创建并存储完整对象而不创建中间对象。

但是当我尝试在A中声明一个B类型的对象(而不仅仅是一个指针)时,我得到一个no matching function for call to 'B::B()错误。

这是我尝试的方法,但不起作用:

#include <iostream>
// B i not changed
class B{
    public:
        B(int i);
        int i;
};

B::B(int i) {
    this->i = i;
}

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

A::A(int i) {
    this->b(i); //initialize
}


int main()
{
  A a(8);
  std::cout << a.b->i;
}

为什么在声明B b;变量而不是指针B *b;时出现“无匹配函数”错误? 我的方法this->b(i);是否在声明正确后初始化成员?

1 个答案:

答案 0 :(得分:3)

您的类B没有提供不带参数的构造函数(一旦您声明任何其他构造函数,隐式定义的默认构造函数就会被删除)。 当您使用类型为A的数据成员定义另一个类class B时,除非您明确定义应使用哪些参数的B构造函数,否则系统无法初始化此数据成员。

你可以通过......克服这一点。

  1. b的构造函数的成员初始值设定项列表中调用A的构造函数,即A::A(int i) : b(i) {}

  2. 在定义数据成员b时默认初始化,即在A中,写B b = B(1);

  3. B中定义(用户定义的)默认构造函数,例如B() : i(0) {}

  4. B的(唯一)构造函数中定义默认值,例如B(int i=0)

  5. 我更喜欢选项1;选项2..4仅为完整性而列出。

    请注意,构造函数体中的任何代码(不管代码是什么)都不被视为“数据成员初始化”。