boost::bind als friend?
-
Nexus schrieb:
drakon schrieb:
Eine nicht implementierte virtuelle Methode ist eigentlich kein Problem ausser du erstellst eine Instanz des Basistypen, dann hat es selbstverständlich keine definierte Methode.
Du meinst wahrscheinlich rein virtuelle Methode. Eine virtuelle, nicht implementierte Methode macht dem Linker Probleme (sofern sie aufgerufen wird).
Nein. Ich habe in der Tat vermutet, dass es kein Problem ist, sofern die Basiklasse nicht instanziert wird, da es ja eine gültige Defintion gibt.
Ich habs jetzt mal ausprobiert und sie muss nicht einmal aufgerufen werden! Und sie muss auch nicht nicht mal in einer Kindklasse implementiert sein, um einen Fehler vom Linker zu erzeugen.
Interessant, dass es sich so anders verhält.
-
drakon schrieb:
Nein. Ich habe in der Tat vermutet, dass es kein Problem ist, sofern die Basiklasse nicht instanziert wird, da es ja eine gültige Defintion gibt.
Zur Kompilierzeit ist aber oftmals unklar, welche Funktion dynamisch tatsächlich aufgerufen wird, deshalb müssen alle Kandidaten definiert sein.
-
Eine kleine Frage am rande die auch noch interressant für mich wär, da es im laufenden Programm nicht klappt. Ich will einen Thread vorzeitig beenden sollte ein bestimmter Fall eintreten...
boost::thread waiting(boost::bind(&methode,this)); while(waiting.joinable()) //müsste ja eigtl false zurückliefern wenn der Thread beendet wurde { if(!running/*die boolean zur überprüfung ob es beendet werden soll*/) waiting.timed_join(boost::get_system_time()); }das funktioniert überhaupt nicht... die schleife frisst VIEL zu viele ressourcen... gibt es da eine bessere Lösung? (Kann man mit boost eigtl die Größe des Stacks begrenzen die dem Thread zur verfügung steht wie es mit anderen Thread-typen möglich ist?)
Und diese methode läuft auch wiederrum in einem thread, also kann running verändert werden
nur so falls einer fagt
-
Jud4s, es übersieht dich schon keiner, du brauchst dich nicht zu wiederholen.

drakon und ich haben eben nebenbei noch etwas diskutiert, sowas ist hier ziemlich alltäglich.

-
ok dann srry für doppelposting... dachte nur da meine Frage auf der alten Seite ist nacher newcomer sie nichtmehr sehen
-
Nexus schrieb:
drakon schrieb:
Nein. Ich habe in der Tat vermutet, dass es kein Problem ist, sofern die Basiklasse nicht instanziert wird, da es ja eine gültige Defintion gibt.
Zur Kompilierzeit ist aber oftmals unklar, welche Funktion dynamisch tatsächlich aufgerufen wird, deshalb müssen alle Kandidaten definiert sein.
Naja. Wenn eine abgeleitete Klasse die Funktion definiert und davon ein Objekt instanziert wird, dann wird aber sicher die Version der abgeleiteten Klasse aufgerufen. Darum habe ich ja gesagt, dass es sicher ein Problem gibt, wenn die Basisklasse instanziert wird und nicht nur ein abgeleiteter Typ.
Wenn man es polymorph benutzt, dann ist das aber natürlich klar.
-
@Jud: join anstatt joinable. join ist blockierend und kehrt erst dann zurück, wenn der Thread beendet wurde.
-
Ich will das der Thread gezwungen aufhört zu laufen sollte ein bestimmtes ereignis aufgerufen werden.... also quasi ein abbruch. Das Problem ist nur das ich im Thread eine Methode aufrufe die in blocking call ist, deshalb ja den Thread, nach meiner Logik wird die Methode beendeet wenn der Thread beendet wird...nur die Frage ist wie beende ich den thread gesteuert?
Meine Idee war die while-schleife nur die Zieht 100% CPU leistung
-
drakon schrieb:
Wenn man es polymorph benutzt, dann ist das aber natürlich klar.
Ich könnte mir vorstellen, dass ein Compiler virtuelle Aufrufe in offensichtlichen Fällen nicht statisch binden muss, sondern dies als Optimierung durchführen kann (und dann müsste die Basisklassenversion definiert sein).
Allerdings sehe ich nicht wirklich einen Nutzen von einer (nicht pur) virtuellen Funktion ohne Definition, es handelt sich also mehr um ein theoretisches Problem (das aber durch Linkerfehler sogar auf potentielle Programmfehler hinweisen kann).
-
Nexus schrieb:
Allerdings sehe ich nicht wirklich einen Nutzen von einer (nicht pur) virtuellen Funktion ohne Definition, es handelt sich also mehr um ein theoretisches Problem (das aber durch Linkerfehler sogar auf potentielle Programmfehler hinweisen kann).
Das sehe ich auch so. Darum habe ich auch gleich gesagt, dass man eher eine abstrakte Klasse hat als Basis. Ich wär gar nie auf die Idee gekommen so etwas, wie er zu machen.
