【问题标题】:C++ How to Initialize member object?C++如何初始化成员对象?
【发布时间】:2015-02-10 16:33:46
【问题描述】:

在下面示例的第一部分中,有什么方法可以初始化(?)类型为 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);
}

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

【问题讨论】:

  • 通常你不需要new。而且你永远不会同时使用new/free。是的,C++ 提供了初始化对象的方法。
  • 对不起,不好的例子。我根本不想使用new。可以做到吗?如何? (将编辑问题)
  • 是的,它可以做到,@StenSoft 的回答告诉你怎么做。
  • 另外,您的班级C 没有任何名为a 的数据成员。

标签: c++


【解决方案1】:

成员变量在构造函数的初始化列表中(在正文之前)进行初始化,因此您需要这样做:

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

【讨论】:

  • 我现在看到了我的困惑。俗话说,森林里的树太多,我看不到森林。我真正需要的是:public: B(A &a) : a(a), c(a).
【解决方案2】:

你几乎拥有它:

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 之前,非静态数据成员初始值设定项 (NSDMIs) 被禁止。但是,即使在 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 类实例的生命周期。使用动态内存管理当然没有必要。

【讨论】:

  • 答案也很好。
【解决方案3】:

“我如何将注入的 A 交给 B 的成员 C?”

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

class B {
public:
    B(A &a) : c(a) {
           // ^^^^
    }

    C c; // <<< It's not possible to initialize members in their
         //     declaration.
};

【讨论】:

  • 我现在看到了我的困惑。俗话说,森林里的树太多,我看不到森林。我真正需要的是:public: B(A &amp;a) : a(a), c(a)。或者实际上,在我的真实代码中 public: B(A &amp;a) : a(a), c(a), d(a, c).
【解决方案4】:

以下内容:

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

因为a(初始化列表中的第一个a)不是C的成员变量,所以不会编译。

同样适用于B的构造函数。

【讨论】:

  • 对于不完整的示例,我深表歉意。在我真正的问题中,a 也是一个成员。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多