Funktion über Zeiger aufrufen aus Klasse???
-
Hi All,
Ich hoffe das ich damit jetzt kein Vogel abschiesse, aber ich weiss net wie ich es machen soll. (Zeiger, Pointer)???
Ich möchte aus einer Klasse (CBeispiel.cpp) auf den Funktion (MainCall) in main.cpp zugreifen.
Beispiel:
Datei: Main.cpp void MainCall() { } Datei: CBeispiel.cpp -------------------- CBeispiel::CallMe() { //--- Funktion in main.cpp aufrufen // MainCall() <---- }Ich hoffe ihr könnte mir da helfen. :p
-
Damit das geht, muss der Compiler wissen, dass es so eine Funktion gibt und wie man sie aufruft.
Es reicht also, wenn du ihm die Funktion mit einer Vorwärtsdeklaration bekannt machst:Datei: CBeispiel.cpp -------------------- void MainCall(); CBeispiel::CallMe() { MainCall(); }Wenn du sowas aber öfters machen musst, bieten sich dafür Headerdateien an.
-
Ich hoffe Du hast mich richtig verstanden.

ich weiss das ich die Funktionen in einer klasse in Header Dateien defineren muß. Aber ich weiss nicht wie das hier geht.
#include <cstdlib> #include <iostream> #include "CBeispiel.h" using namespace std; CBeispiel CallTest; void function MainCall() { cout << "Aufgerufen" << endl; } int main(int argc, char *argv[]) { CallTest.CallMe(); //-- <--- Hier soll MainCall aufgerufen werden aus CallMe //-- Das brauche ich weil in CallTest nach einer verarbeitung MainCall Aufrufen möchte system("PAUSE"); return EXIT_SUCCESS; }Danke!!!

-
Schau dir in den Weiten des Internets mal Funktionszeiger an

-
Speziell zu erwähen wäre hier noch, dass Funktionszeiger auf Memberfunktionen nicht so trivial sind, wie auf normale Funktionen. (Also speziell danach suchen, wenn dus brauchst!)
-
Also könnte ihr mir net schnell ne Lösung geben?
-
um? ich versteh entweder nicht was du machen willst oder wo das problem ist
"Ich möchte aus einer Klasse (CBeispiel.cpp) auf den Funktion (MainCall) in main.cpp zugreifen."
also du hast ne klasse CBeispiel die vermutlich aufgeteilt ist ein eine .h und eine .cpp file und eine methode MainCall die nicht zu einer klasse gehört sondern im global namespace ist direkt und diese ist in main.cpp definiert
mach einfach eine main.h wo du diese funktion deklarierst also
//CBeispiel.h #pragma once class CBeispiel { void CallMainCall(); };//CBeispiel.cpp #include "CBeispiel.h" #include "main.h" void CBeispiel::CallMainCall() { ::MainCall(); }//main.h #pragma once void MainCall();//main.cpp #include "main.h" #include "CBeispiel.h" void MainCall() { } void main(int argc, char **argv) { CBeispiel beispiel; beispiel.CallMainCall(); }
-
wenn es immer dieselbe funktion sein soll, die in
CBeispiel::CallMeaufgerufen werden soll, musst du diese eben vorher in dem header deklarieren. (nicht definieren!) - wenn du das schon weißt, und du tatsächlich nach funktionszeigern suchst, könnte man dir auch so etwas empfehlen:#include <tr1/functional> //oder auch nur <functional> //oder: #include <boost/functional> //wenn du boost installiert hast (was du solltest) class CBeispiel { public: void CallMe (std::tr1::function<void(void)> fun) //oder boost::function<void(void)> { fun(); } }; //... void MainCall (); int main () { CBeispiel foo; foo.CallMe(MainCall); }dann ersparst du dir auch das lästige herumgefrickel mit memberfunktionen (weil du einfach
std::tr1::bindbzw.boost::bindverwenden kannst).
-
Vielen Dank an euch!!!! (Besonders an Vevusio) genauso habe ich gemacht.
Und es funktioniert.DANKE!!!!

-
Und worin unterscheidet sich das jetzt von dem, was ich schon gesagt habe?
-
Ja ( _T ) Du hast recht es ist auch möglich in CBeispiel.cpp
void MainCall();zu plazieren, hat aber mir nicht so gefallen. Weil ich nicht in Klassen so einfach Memberfunktionen reinschreiben möchte das finde ich nicht so schön.
Aber trozdem danke auch an Dich!!!

-
evirus schrieb:
Ja ( _T ) Du hast recht es ist auch möglich in CBeispiel.cpp
void MainCall();zu plazieren, hat aber mir nicht so gefallen.
Genau das hast du aber im Endeffekt auch gemacht. Du bindest die "main.h" ein, was einfach nur bedeutet, dass der Inhalt der "main.h" an die Stelle der #include-Zeile kommt. Also hast du auch einfach nur diese Forward-Deklaration in CBeispiel.cpp drin, nur halt über den Umweg des Prä-Prozessors. Abgesehen davon, dass "_T" schrieb
Wenn du sowas aber öfters machen musst, bieten sich dafür Headerdateien an..evirus schrieb:
Weil ich nicht in Klassen so einfach Memberfunktionen reinschreiben möchte das finde ich nicht so schön.
Sorry, aber dieser Satz ist absoluter Unfug

-
OK OK bin ja noch kein profi.
Es tut mir leid wenn ich hier mehr arbeit gemacht habe als nötig.
Sorry an alle.Aber trozdem sind hier super möglichkeiten aufgelistet wurden und dafür bin ich sehr sehr dankbar.
Danke nochmal an alle.
-
Ach, das war doch nicht böse gemeint
Ich wollte dich nur drauf hinweisen, dass der Vorschlag von _T auf's Gleiche rauslief.. Und ist doch klar, dass man immer ein paar Sachen nicht weiß; aber wenn du Lust hast, kannst du dir ja einige Dinge über den C++-Präprozessor im Netz durchlesen 