ここでは問題です: 純粋な仮想メンバが呼び出されるstd :: functionを持つ抽象クラスでメンバを初期化する方法は?
#include <functional>
#include <iostream>
#include <memory>
#include <string>
class Object {
public:
Object(std::function<void(int param)> f) : func(f) {}
~Object() { func(0); }
private:
std::function<void(int param)> func;
};
次に、このような抽象基底クラスと、いくつかの派生クラス:
私は、そのコンストラクタObject
というクラスは、このようなstd::function
を受け付けてい
class AbstractBase {
public:
AbstractBase() {
// How to initialize object.
}
virtual std::string toString() const = 0;
private:
Object object;
};
class Derived1 : public AbstractBase {
public:
std::string toString() const override { return "Derived1"; }
}
class Derived2 : public AbstractBase {
public:
std::string toString() const override { return "Derived2"; }
}
object
をAbstractBase
に初期化しようとしています:
AbstractBase()
: object([this](int param) {
// do something
std::cout << toString() << std::endl;
// do something
}) {}
それは正常にコンパイルが、AbstractBase
が削除されたとき「と呼ばれる純粋仮想メソッド」を発生させます。だからobject
をAbstractBase
に初期化し、派生クラスのtoString
がstd::function
で呼び出されていることを確認しますか?
は[MCVE]を提供してください。 '〜' AbstractBase() 'の' this'に 'object'関数を使用しようとしていますか? – Barry
'AbstractBase'デストラクタがいつ実行されるかを考えてください。 –
質問が更新されました。望ましい動作は、 'Object'が' Derived1'と 'Derived2'からいくつかの情報を取得するのに使用され、' Object'が破壊されると、収集された情報が保存されます(この場合はstdoutに出力されます)。 –