言いたいことがたくさんあります。まず、以下のアプローチがデザインパターンであるのか、それとも一般的なテクニックであるのかを知りたいのですが、それで、タイトルに関する詳細な情報は得られませんでした。それが事実なら、名前は何ですか? とにかく、これは私が達成しようとしているものの縮小バージョンです。私はコピーを使用する必要があるので、私はstd :: shared_ptrを使うことが、割り当てられていない(削除された)ポインタを避けるのが最善であることを発見しました。継承とスマートポインタ(std :: shared_ptr)
class Foo
{
public:
Foo() : ptr(nullptr) {}
Foo(const Foo& foo) : ptr(foo.ptr) {}
virtual ~Foo() = default;
void whatever() {
if (ptr)
ptr->whateverHandler();
}
void reset() {
ptr.reset();
}
void resetBar() {
ptr.reset(new Bar);
}
// Other resets here...
protected:
Foo(Foo* foo) : ptr(foo) {}
private:
// Every child class should override this
virtual void whateverHandler() {
throw "whateverHandler cant be called within base class";
}
protected:
std::shared_ptr<Foo> ptr;
};
class Bar : public Foo
{
public:
Bar() : Foo(this) {}
void whateverHandler() {
printf("Bar's handler!!! \n");
}
};
これはすべてうまく見えてコンパイルされますが、以下のexameがクラッシュします。何故ですか?
int main()
{
{
Foo f;
f.resetBar();
}
return getchar();
}
は 'Bar'が破壊されると、その' Foo'は二回 – Danh
あなたは 'のstd :: enable_shared_from_this'を必要とするかもしれない破壊されます。しかし、この特定の例では、それを必要としません。 – Danh
仮想デストラクタもありません。 –