Zuweisung eines Funktionspointers
-
Hallo,
kann mir jemand eine Tip geben, wie ich den u.g Code kompilieren kann?
Ich scheitere aninnereKlasse::foo = &innereKlasse::sum;
Es geht darum einen Funktionspointer in der inneren Klasse mit einer Methode der inneren Klassen zu intialisieren.
Fehlermeldung: "E0513 Ein Wert vom Typ ""int (aeussereKlasse::innereKlasse::)(const int &a, const int &b)"" kann keiner Entität vom Typ ""int ()(const int &, const int &)"" zugewiesen werden. Project1 C:\Users\a\Documents\Project1\Project1\Quelle.cpp 34"
"Fehler C3867 "aeussereKlasse::innereKlasse::sum": Keine Standardsyntax; "&" zum Erstellen eines Verweises auf das Member verwenden Project1 C:\Users\a\Documents\Project1\Project1\Quelle.cpp 35"
"Fehler C2440 "=": "int (__cdecl aeussereKlasse::innereKlasse::* )(const int &,const int &)" kann nicht in "int (__cdecl *)(const int &,const int &)" konvertiert werden Project1 C:\Users\a\Documents\Project1\Project1\Quelle.cpp 35"class aeussereKlasse { private: class innereKlasse { private: int(*foo)(const int, const int); int sum(int a, int b) { return a + b; } public: bool init(int, int); }; }; bool aeussereKlasse::innereKlasse::init(int x, int y) { innereKlasse::foo = &innereKlasse::sum; //Das geht: // innereKlasse::foo = [](int a, int b){return 1; }; return true; }
-
was hast du damit vor?
das scheint mir ein falscher Weg zu sein
-
Das ist ein Code, den ich übernommen habe. Muss ihn zum Laufen kriegen. An der Struktur darf ich nichts ändern.
-
das macht so keinen Sinn.
Du musst die interne class noch initiieren new class()
-
Das geht prinzipiell nicht mit direkten Funktionszeigern.
InnereKlasse::foo
nimmt nur Zeiger auf freie Funktionen oder statische Klassenfunktionen entgegen,InnereKlasse::sum
ist aber eine Funktion der KlasseInnereKlasse
, die für den Aufruf eine Instanz der KlasseInnereKlasse
benötigt. Diese Instanz kannst du aber nicht implizit übergeben, da musste dir was einfallen lassen.
-
Ok. Danke.
-
Singleton design pattern zb
-
Aber skared hat schon recht...
WAS willst eigentlich erreichen? Und wer hat dir diesen Quelltext vermacht, kann derjenige dir nicht erklären, was er sich bei diesem merkwürdigen Konstrukt gedacht hat?
-
Bei mir lässt sich es sich so übersetzen.
class aK { class iK { int (aK::iK::* foo) (const int, const int); int sum(int a, int b) { return a + b; } public: bool init(int, int); }; }; bool aK::iK::init([[maybe_unused]] int x,[[maybe_unused]] int y) { aK::iK::foo = &aK::iK::sum; return true; }
-
@john-0
Mag ja sein, aber OP darf die Struktur nicht verändern, damit ist und bleibtfoo
ein Zeiger auf eine freie oder statische Klassenfunktion.
-
Dann bleibt nichts anderes übrig, eine freie Funktion als Wrapper zu nutzen, oder man fängt an wild mit
reinterpret_cast
einzuschlagen, und darauf zu hoffen, dass der Compiler kein Problem damit hat.Nachtrag: Da eine Member Function einen impliziten
this
Pointer übergeben bekommt, dürfte der Cast zum Crash führen. Und ich bin mir nicht sicher, ob man eine Static Member Function statt einer freien Funktion nutzen kann. Als C Callback kann man keine Static Member Function nutzen.
-
Ich glaube, ich kündige...
-
@asd1 sagte in Zuweisung eines Funktionspointers:
int sum(int a, int b) { return a + b; }
Schreib da einfach
static
vorn dran.
-
Ok. Danke!
-
@asd1 sagte in Zuweisung eines Funktionspointers:
Ok. Danke!
Häh? Ich dachte, du darfst nichts ändern?
-
Naja, was genau "die Struktur" ist, an der nichts geändert werden darf, wurde nicht erklärt.