基本クラスといくつかの派生クラスがあるとします。
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、 myBase1
とBase2
は概念が異なるため、ここでは多重継承で問題ありません。
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
(p
vector
objs