用于以下场景的模式是什么?

Adr*_*ian 2 c++ design-patterns

我有以下课程:

class Base {
public:
    Base(string name) {
        agg = new Aggregate(name);
    }
private:
    Aggregate* agg;
};
Run Code Online (Sandbox Code Playgroud)

现在我需要扩展这个类:

class Derived : Base {
public:
    Derived(string name) : Base(name) {
        agg2 = new Aggregate2(name);
    }
private:
    Aggregate2* agg2;
};
Run Code Online (Sandbox Code Playgroud)

我想要的是当我创建一个Base对象时,Aggregate需要创建它,当我创建一个Derived对象时,Aggregate2应该只创建它.

现在这不会发生,因为Aggregate它是在构造函数内部创建的,当我创建一个Derived对象Aggregate并且Aggregate2会创建它时会调用它.

我可以将创建移动到另一个方法,并在创建对象后调用它.
有没有其他优雅的方式来做我想要的?

Jar*_*d42 6

您可以使用以下内容:

class Base {
public:
    explicit Base(string name) : agg(new Aggregate(name)) {}
protected:
    Base() = default;
private:
    std::unique_ptr<Aggregate> agg;
};

class Derived : Base {
public:
    // implicit call to Base(), you may be explicit if you want
    Derived(string name) : agg2(new Aggregate2(name)) {}
private:
    std::unique_ptr<Aggregate2> agg2;
};
Run Code Online (Sandbox Code Playgroud)