从参数初始化成员变量

Initialise member variables from parameter

我不知道如何制作一个通用的初始化函数,它为特定的成员变量创建一个新对象。

假设我有一个 Foo 对象,它有两个 Bar 成员。

class Bar {

public:
    Bar();
    ~Bar();
};


class Foo {

public:
    Foo();
    ~Foo();

private:

    void init(Bar * x);

    Bar * a;
    Bar * b;

};

现在我想用同样的方式初始化两个 Bar 成员:

Foo::Foo(){

    init(a);
    init(b);

}

void Foo::init(Bar * x) {

    x = new Bar();
    std::cout << x << std::endl;
    std::cout << a << std::endl;
}

Foo 中的初始化函数应该为成员 a 和成员 b 创建一个新的 Bar()。然而,成员 a 和局部参数 x 的地址不同(即 Foo.a 未初始化)。如何在 init 函数中初始化 ab

您的 init 需要通过引用获取其参数:

void Foo::init(Bar*& x) {
    x = new Bar();
}

这样,您分配的 new Bar 实际上会达到 ab。否则,您只是分配了一个临时(并泄漏)两次。

或者,您可以将 init() 命名为 create()(或同等名称),并且只是 return a new Bar:

Bar* Foo::create() {
    return new Bar;
}

这样你的构造函数可以是:

Foo() {
    a = create();
    b = create();
}

或者简单地说:

Foo()
    : a(create())
    , b(create())
{ }