Kurze Hilfe für die Übergabe von Zeiger auf Funktion als Parameter

Niv k

Mitglied
Hallo alle zusammen,

ich bin grade an ein paar Zeilen Code zugange, komme jedoch nicht weiter mit meinen Kenntnissen und auch meine bisherigen Suchen blieben erfolglos!
Kurze Situtatuion:
Ich habe eine Button klasse und diese soll auf onclick eine Funktion aufrufen, die als Parameter übergeben wurde. Ich poste mal einen kurzen beispielcode mit den wichtigsten Stellen, da der gesamte Quellcode über mehere Dateien geht und zu lang ist.

C++:
HEADER

class Button
{
public:
  Button(std::string,void (*) ());    //  So ist das bis jetzt als Parameter!
  void onClick();
private:
  void (*function) ();  // Wird als Variable für alle anderen methoden verfügbar gemacht
}

CPP

Button::Button (std::string Text, void (*newFunction))
{
   function = newFunction;
   //...Tu irgendwelche ganz tollen anderen Sachen //
}

void Button::onClick()
{
  // Tu erst ein paar schöne Sachen und dann...//
  function();     // ... muss die Function dann aufgerufen werden! 
}

MAIN CPP

int main ()
{
  function* AbbrechenFunktion = new function("VieleParameter");
  Button("Abbrechen",function->breakSth()); // Hier weiß ich auch nicht wie ich die Funktion richtig übergebe!
}

Das ist jetzt natürlich zur Übersichtlkeit sehr stark verkürzt!
Aber ich denke daraus erkennt man meine Frage.

Ich denke hier wird sich jemand finden, der mir schnell sagen kann, wo das Problem liegt.

Danke im Vorraus!

Kevin
 
Sorry
Was genau meinst du jetzt grade? Kann grade nicht erkennen was da fehlt.
Bitte kurze Erklärung?

Also .h und .cpp sowie die main.cpp hab ich oben in einem Codeblock durch Überschrifften Markiert, wenn du das meinst.
 
Nein, das meine ich eigentlich nicht. Ich verstehe nicht woher die Variable *function und die Funktion Button kommen soll. Die sind zwar in der Klasse definiert, aber du brauchst ja ein Objekt zu deiner Klasse. Zum Beispiel so.
C++:
class coord
{
private:
int x;
int y;
public:
void SetPos(int x, int y)
{
      coord::x=x;
      coord::y=y;
}
// Hoffentlich keine Syntaxfehler :D
}

int main() {
     coord Koordinate;
     Koordinate.SetPos(100, 100);
     return 0;
}
Aber du kannst nicht einfach eine Funktion einer Klasse ohne Objekt aufrufen.
Gibt der Compiler denn Fehlermeldungen aus oder was ganau ist das Problem?

EDIT:
Könntest du vielleicht den Code mit [code=cpp] statt [CODE] für highlighting posten/bearbeiten? :)
 
Zuletzt bearbeitet von einem Moderator:
Achso...

Ja ich habe jetzt hier eifnach nur den Konstruktor aufgerufen.
Der *function wird zugewiesen durch den Parameter der rein kommt beim Aufruf.
Mein Problem ist einfach nur, dass ich nicht weiß, wie ich das zu schreiben habe.
Ich möchte einfach nur eine Funktion übergeben und diese soll dann später ausgeführt werden.

Der Compiler sagt das es nicht möglich ist von "void" nach "void (*) ()" zu casten.
Der Rest funktioniert.
 
In welcher Zeile denn?

Hier mal ein Beispiel-Code:
C++:
http://codepad.org/qvj9wOEr
Eventuell wäre es auch günstig sowas zu definieren:
C++:
typedef void (*ButtonOnClickListener)();
 
Also das ist genau diese Zeile: (das ist jetzt vom Original)

Code:
Button* AbbrechenButton = new Button(100,130,"Abbrechen",MessageBox,MainWindow->break());
                                                              // (X,Y,Text,RefAufFenster,Funktion) <- Kurzerklärung //
 
Also zu deinem Code, den du am Anfang gepostet hast:

Am Ende der classdefintion von Button ein ";".
Zeile 14 Konstruktordefinition beim 2.Parameter die () am Ende vergessen.
Zeile 30 im main du willst einen Pointer vom Typ function* erstellen, was ist der Typ function? Der wurde nirgends definiert.
In Zeile 31 ist dasselbe, niemand weiß was function ist, deshalb kann dir hier auch niemand helfen. Sollte das ein Objekt sein, du kannst keine Memberfunktionen einer class als normale Funktion übergeben, du müsstest einen pointer-to-member pointer an die Funktion übergeben, aber sag uns bitte als erstes, was das function ist.

Lg
 
Hallo wieder,

Ist ja nett das du meine syntaxfehler korrigierst, aber das ist nur ein schnell Beispiel das ich am, eben da hin getippt habe. Also kein original Code aus meinem eigentlichem Programm, das wäre wie gesagt zu viel.

Also der *function ist nur ein Beispiel... Soll einfach eine beliebige Funktion darstellen die übergeben werden soll. Also sagen wir so: ich möchte einen beliebigen Zeiger auf eine Methode übergeben also eben sowas beispielklasse->beispielmethode(). Was sicher sein kann's ist das sie's keine Parameter hat und vom Typ void ist. Was dabei jetzt genau die Funktion ist soll egal sein deswegen habe ich sie oben an nirgens definiert.

Wie genau würde das denn dann mt dem typendef Button Eventhandler gehen ?

Sorry für Rechtschreibfehler und sowas habe das hier schnell mit dem iPad getippt und keine zeit für Korrektur gehabt!
 
Zurück