0

基本クラスといくつかの派生クラスがあるとします。

class Base1
{
public:
    virtual ~Base1() {}
    virtual void update() = 0;
};

class Derive1 : public Base1
{
public:
    void update() override {/*...*/}
};

class Derive2 : public Base1
{
public:
    void update() override {/*...*/}
};

そして私の派生オブジェクトを管理する場所:

class Base1Manager
{
public:
    void add(Base1* p)
    {
        objs.push_back(p);
    }
    void update()
    {
        std::for_each(objs.begin(), objs.end(), [](Base1* p) { p->update(); });
    }
    void clear()
    {
        std::for_each(objs.begin(), objs.end(), [](Base1* p) { delete p; });
        objs.clear();
    }
    std::vector<Base1*> objs;
};

Base1Manager bm1;
bm1.add(new Derive1());
bm1.add(new Derive2());

更新できます:

bm1.update();

最後に、プログラムの終了時にリソースを解放する必要があります。

bm1.clear();

上記のシナリオは問題ありませんが、次のシナリオはそうではありません。


問題は、別の基本クラスを追加して派生クラスを展開するときです。

注: この回答によると: [ C++ で多重継承を避ける必要があるのはなぜですか? 、ポイント 3 と 4、 myBase1Base2は概念が異なるため、ここでは多重継承で問題ありません。

class Base1
{
public:
    virtual ~Base1() {}
    virtual void update() = 0;
};

class Base2
{
public:
    virtual ~Base2() {}
    virtual void do_different_thing() = 0;
};

class Derive1 : public Base1, public Base2
{
public:
    void update() override {/*...*/}
    void do_different_thing() override {/*...*/}
};

class Derive2 : public Base1, public Base2
{
public:
    void update() override {/*...*/}
    void do_different_thing() override {/*...*/}
};

Base2Managerまた、基本的に と同じ新しい があると想像してくださいBase1Manager

最後に私の質問は、リソースを適切に解放する方法です。

どうやら、リリースを 2 回行うことはできません。

bm1.clear();
bm2.clear();

マネージャーを1人だけ選んでやらせればいいのですが、この2人のマネージャーは別々に作られていてお互いを知りません。

スマートポインターは役に立ちますか? addButNotRelase(Base2* p)操作はできるpが所有はできないようなAPI を追加する必要がありますp(pvectorobjs

4

1 に答える 1

1

std::shared_ptr両方のマネージャーが (潜在的に同じ) ポインターを所有しているため、ここで役立ちます。

最初の例では、マネージャーが 1 人しかいないため、 に置き換えstd::shared_ptrた可能性がありますstd::unique_ptr

ライフタイムを制御するために他のクラスがオブジェクトを所有する必要がある場合は、マネージャーで単純なポインターを使用できます。

使用法は次のようになります。

// The container
std::vector<std::shared_ptr<Base1>> base1s;
std::vector<std::shared_ptr<Base2>> base2s;

// The objects
std::shared_ptr<Derive1> d1 = std::make_shared<Derive1>();
std::shared_ptr<Derive2> d2 = std::make_shared<Derive2>();

// Feed the containers
base1s.push_back(d1);
base1s.push_back(d2);

base2s.push_back(d1);
base2s.push_back(d2);
于 2014-08-07T07:51:24.783 に答える