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 に答える