0

考虑下面的类

class Forwarder : public Base
{
private:
     Base* dest;
     Forwarder* next;
public:
    explicit Forwarder(Base* dest, Forwarder* next)
        : dest(dest), next(next) {}
    ~Forwarder() {
        if (next) delete next;
        delete dest;
    }

    void DoStuff() {
        if (next) next->DoStuff();
        dest->Process();
    }
};

它的目的是为事件创建一个转发链,因此如果DoStuff在基层被调用,它将在整个链中传播,并通知其他人。我想用它来将输出发送到各种流。无论如何,创建链的典型方法是:

Forwarder f(new First, new Forwarder(new SomeOther, new Forwarder(new YouGetTheIdea, NULL)));

这是一种非常方便的构建链的方法,但它很危险并且容易受到内存泄漏的影响,因为编译器可以随机播放。有没有更安全的方法来构建我想要的链(最好保留精益语法)?

4

1 回答 1

1

不要显式使用,而是使用new返回智能指针的函数,并使构造函数接受智能指针。

For example,

class Forwarder : public Base
{
private:
     shared_ptr<Base> dest;
     shared_ptr<Forwarder> next;
public:
    explicit Forwarder(shared_ptr<Base> dest, shared_ptr<Forwarder> next)
        : dest(dest), next(next) {}

    void DoStuff() {
        if (next) next->DoStuff();
        dest->Process();
    }
};

然后像这样使用它:

Forwarder f(make_shared<First>(), make_shared<Forwarder>(make_shared<SomeOther>(), make_shared<Forwarder>(make_shared<YouGetTheIdea>(), shared_ptr<Forwarder>(NULL))));

unique_ptr如果您实现make_unique()(或等效的工厂方法) ,您也可以改用

于 2013-02-03T23:35:04.293 回答