Ich habe zwei Strukturen, Struktur B erbt von Struktur A. Ich möchte eine Funktion als Parameter von Struktur B an Struktur A für Struktur A übergeben.C++ Übergabe der Strukturfunktion als Parameter für eine Funktion in einer geerbten Struktur
Dies ist ein Beispiel für das, was ich erreichen möchte und das Problem, in das ich renne, wäre der vollständige Code TL; DR.
struct A
{
int32 mynum;
void Tick(float delta, bool doThis, void (funcparam)(float, bool, int32))
{
funcparam(delta, doThis, mynum);
}
};
struct B : public A
{
void RunThis(float deltaTime, bool doIt, int32 which)
{
// do something when called by Struct A
};
void DoSomething()
{
Tick(0.1f, true, &B::RunThis);
};
};
Das Problem ist mit dieser Zeile: Tick(0.1f, true, &B::RunThis);
von der Funktion void DoSomething()
, wenn ich es falsch von Anfang an getan habe, aber ich glaube, ich es falsch bin vorbei, da es im Header noch ist der Struktur, die ich gerade definiere?
Fehler (ich den Fehler geändert haben, meinem Beispiel zu passen, ich glaube nicht, dass ich vermasselt ..):
error C2664: 'void A::Tick(float,bool,void (__cdecl *)(float,bool))': cannot convert argument 3 from 'void (__cdecl B::*)(float,bool)' to 'void (__cdecl *)(float,bool)'
die B::
von &B::RunThis
natürlich Weglassen löst nichts.
Schauen Sie in 'std :: function()', Ihr Funktionszeiger 'void (funcparam) (float, bool, int32)' kann keine Mitgliedsfunktionszeiger aufnehmen. –
'' void (funcparam) (float, bool, int32) '' ist nicht was du willst. Zuerst ist die Signatur eines (Nicht-Mitglieds) Funktionszeigers '' void (* funcparam) (float, bool, int32) '' (Sie haben das * verpasst). Zweitens könnten Sie Tick() eine Funktion der Basisklasse machen, die dann eine virtuelle Funktion aufruft, die Sie in der abgeleiteten Klasse überschreiben. Dies ist immer noch ein besserer Ansatz im Vergleich zur Verwendung von '' std: function'', solange Sie eine 1: 1-Beziehung von "abgeleiteter Klasse" haben: "Funktion, die Sie ausführen möchten." – BitTickler
@BitTickler - das war eine viel bessere Lösung für meinen Zweck, danke! Wie für die Antwort auf die spezifische Frage, ich werde immer noch darauf warten, dass es veröffentlicht wird, so dass Leute, die ähnliche Probleme googlen, eine genaue Antwort haben – Vii