C++如何初始化成员对象

C++ How to Initialize member object?

本文关键字:成员对象 初始化 C++      更新时间:2023-10-16

在下面示例的第一部分中,是否有一些方法可以初始化c类型的(?)成员变量c?或者我必须使用示例第二部分中显示的new()方法吗?

类B将类A作为注入的依赖项。C类也是如此。B类由C类额外组成。

如何将注射的A注射给B的成员C?

第1部分

class A { // ...; };
class C {
public:
    C(A &a) : a(a) {}   // constructor
};

// Does not work as is.  Want to make compiler manage C lifetime.
class B {
public:
    B(A &a);    // constructor
    C c(a);     // member variable
};
// constructor
B::B(A &a) : a(a) {
}

第2部分

// Works, but requires programmer to manage C's lifetime.
class B {
public:
    B(A &a);    // constructor
    C *c;       // member variable
};
// constructor
B::B(A &a) : a(a) {
    c = new C(a);
}

下面有几个不错的答案!我为这个令人困惑的例子道歉。我对所有好的答案和问题都投了赞成票。不幸的是,我只能将一个答案标记为已接受的答案,所以我选择了第一个,它让我看到了我真正问题的解决方案,这比我在这里的蹩脚例子更复杂。

成员变量在构造函数的初始化列表中初始化(在主体之前),因此需要执行以下操作:

B::B(A &a)
    : c(a) // Calls constructor C(a) on member c
{}

您几乎拥有它:

class B {
public:
    B(A &a);
    C c(a); //see note 1
};
B::B(A &a) : a(a) { //see note 2
}

注1:

这里C c(a);有两个问题:

  1. a不在作用域中。a只存在于构造函数的范围内,因此需要从那里初始化c
  2. 在C++11之前,非静态数据成员初始值设定项(NSDMI)是被禁止的。即使在C++11中,初始化NSDMI时也必须使用等号(C c = value;)或大括号(C c{value};

注2:

你几乎说对了:

B::B(A &a) : a(a)

您正在尝试初始化一个名为a的数据成员,该成员的参数给定给构造函数。实际上,您想要像这样初始化c,而不是不存在的a:

B::B(A &a) : c(a)

c的生存期将是B类的实例的生存期。使用动态内存管理当然不是必须的。

"如何将注入的A送到B的成员C?"

您可以使用B的构造函数成员初始值设定项列表来完成此操作

class B {
public:
    B(A &a) : c(a) {
           // ^^^^
    }
    C c; // <<< It's not possible to initialize members in their
         //     declaration.
};

以下内容:

C(A &a) : a(a) {}

由于CCD_ 13(初始化列表中的第一个a)不是CCD_。

B的构造函数也是如此。