001
01.12.2016, 11:51 Uhr
ao
(Operator)
|
Ich kenne mich mit Funktoren nicht wirklich aus, aber es scheint, als ob der Funktor nur die Basisklasse zu einem _Callable macht und nicht die abgeleitete Klasse. Wenn man ThreadBase::DoStartThread pure-virtual macht (was legitim wäre mit dem Argument, dass es zweckfreie ThreadBase-Objekte nicht geben soll), dann compiliert das nicht, was mich vermuten lässt, dass der Compiler zu dem Zeitpunkt nur auf den statischen Teil der Basisklasse Zugriff hat, aber nicht auf die vtable. Probier das mal aus, vielleicht kommst du aus den Fehlermeldungen auf eine ordentliche Lösung.
Hingekriegt habe ich es mit folgender Änderung. Der Trick ist, der Basisklasse einen Pointer auf das abgeleitete Objekt zu geben und DoStartThread direkt an diesem aufzurufen. Dann landet man in MyThread::DoStartThread. Ich bin mir aber nicht sicher, ob das nicht dreckig ist.
C++: |
#include <iostream> #include <thread>
using namespace std;
class ThreadBase { private: std::thread *m_pThread { nullptr };
ThreadBase * derived; // ein Pointer auf das abgeleitete Objekt
public: void operator()() { derived->DoStartThread(); } // ()-Op ruft das abgeleitete Objekt
void StartThread() {m_pThread = new std::thread(*this);}
protected: virtual void DoStartThread() { cout << "ThreadBase" << endl; }
ThreadBase (ThreadBase * derived_) : derived (derived_) {} // Konstruktor, um das abgeleitete Objekt bekannt zu machen };
class MyThread : public ThreadBase { protected: virtual void DoStartThread() { cout << "MyThread" << endl; }
public: MyThread () : ThreadBase (this) {} };
int main() { MyThread mt;
mt.StartThread(); }
|
Dieser Post wurde am 01.12.2016 um 12:33 Uhr von ao editiert. |