Hier ist das Problem:Wie initialisiert man das Member in der abstrakten Klasse mit std :: function, in der das reine virtuelle Member aufgerufen wird?
Ich habe eine Klasse Object
, dessen Konstruktor ein std::function
wie dies akzeptiert genannt:
#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;
};
Dann eine abstrakte Basisklasse und mehrere abgeleitete Klassen wie folgt aus:
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"; }
}
Ich versuche, die object
in AbstractBase
wie folgt zu initialisieren:
AbstractBase()
: object([this](int param) {
// do something
std::cout << toString() << std::endl;
// do something
}) {}
Es kompiliert erfolgreich, aber wirft „rein virtuelle Methode namens“ wenn AbstractBase
gelöscht. Also, wie kann ich object
in der AbstractBase
initialisieren und sicherstellen, dass toString
von der abgeleiteten Klasse in der std::function
aufgerufen wird?
Bitte geben Sie eine [MCVE]. Versuchen Sie, die 'Objekt'-Funktion auf' this' in '~ AbstractBase()' zu verwenden? – Barry
Denken Sie darüber nach, wenn der Destruktor 'AbstractBase' ausgeführt wird. –
Aktualisierte die Frage. Das gewünschte Verhalten ist, dass "Object" verwendet wird, um einige Informationen von "Derived1" und "Derived2" zu erfassen, und wenn "Object" zerstört wird, werden die gesammelten Informationen gespeichert (oder in diesem Fall auf stdout gedruckt). –