Memberfunktion von Klasse aus Funktion heraus aufrufen
-
N'Abend,
mein Problem ist folgendes, ich habe eine Klasse die einige Funktionen beinhaltet. In einer dieser Funktionen wird eine andere Funktion aufgerufen, die kein Member dieser Klasse ist. In dieser Funktion wird allerdings wiederum eine Memberfunktion der Klasse aufgerufen (weil sie später auf Objekte der Klasse zugreifen soll) und dabei schepperts, und zwar in Form von "LNK2019: Verweis auf nichtaufgelöstes externes Symbol "void __cdecl drawObj(int,double)"" usw.
Im Code sieht das ganze zusammengefasst in etwa so aus:
In einem Header befindet sich die Klasse:
class Main1 { public: void solve(); void drawObj(int r, double yI); }Imein Haupt .cpp Datei findet sich dann die Funktion, die (unter anderem) die erste Funktion aufruft:
void Main1::solve() { algorithm(); }Diese Funktion befindet sich dann in einem Header und in ihr wird die zwete Funktion aufgerufen:
void algorithm() { void drawObj(int, double); drawObj(r, yI); }Hier kommt dann beim debuggen der Linker error. In einem weiteren Header befindet sich dann noch die gewünschte Funktion:
void Main1::drawObj(int r, double yI) { }Sicher bin ich mir nur, dass ich die richtigen Header eingebunden habe und
wenn ich das ganze nicht mit einer Memberfunktion der Klasse sondern irgend einer anderen Funktion versuche funktioniert alles einwandfrei.Suche jetzt seit Tagen nach einer Lösung und komm aber einfach nicht weiter, auch wenn ich mir sicher bin, dass es nur ein ganz banales Anfängerproblem ist
Ich finde einfach nirgendwo beschrieben wie ich aus der Funktion algorithm heraus die Funktion drawObj aufrufe.Vielen Dank für eure Hilfe im voraus!
-
Du willst in algorithm die Funktion drawObj aus Main1 aufrufen, richtig?
Dazu brauchst du ein Objekt vom Typ Main1 wo du dann ganz normal drawObj aufrufst.void algorithm(){ Main1 m; m.drawObj(); //Zusammengefasst: Main1().drawObj(); }Wenn du sagst, dass du kein Main1-Objekt willst weil drawObj kein Main1-Objekt erfordert, dann mach drawObj static und rufe es direkt auf:
class Main1{ public: static void drawObj(); }; void algorithm(){ Main1::drawObj(); }
-
hi,
danke für die schnelle Antwort! Ja, die erste Möglichkeit ist das was ich versuche....allerdings kommt jetzt "error C2512: "Main1" kein geeigneter Standardkonstruktor verfügbar"?
-
Du musst ihm sagen wie man ein Main1 konstruiert. Das heißt er erwartet sowas:
class Main1{ Main1(){ //Standardkonstruktor ist der ohne Parameter //initialisiere irgendwas oder auch nicht //der leere Standardkonstruktor wird vom Compiler automatisch generiert wenn du nichts anderes sagst, //aber da du eine class hast ist der private und muss noch als public declariert werden oder du nimmst nen struct } //oder sowas: Main1(int parameter){ //parameter sollte fürs bauen eines Main1 irgendwie hilfreich sein //initialisiere irgendwas mithilfe von parameter } };Im Fall von Parametern ändert sich der Aufruf halt in
void algorithm(){ Main1 m(42); m.drawObj(); //Zusammengefasst: Main1(42).drawObj(); }Dann gibts da noch die Regel der großen Drei oder so ähnlich und Kopierkonstruktoren und Initialisierungslisten und so.
-
Wenn algorithm() auf deinem Objekt arbeiten muß dann übergib es ihm doch:
void algorithm(Main1 &obj) { obj.drawObj(r, yI); } void Main1::solve() { algorithm(*this); } // Bzw.: void algorithm(Main1 *obj) { obj->drawObj(r, yI); } void Main1::solve() { algorithm(this); }
-
DankeDankeDanke, jetzt funktionierts...werde über die Standardkonstruktor Sache zwar noch ein bisschen nachdenken müssen um das ganze zu verstehen, aber immerhin es geht:-)