Funktionszeiger
-
Hallo,
ich möchte eine Funktion standardmäßig einen Bestimmten Code abarbeiten lassen. Falls gewünscht, soll sie allerdings den Code einer anderen Funktion abarbeiten.
Ich hatte mir das so gedacht:
void * zeigerProzedur();
void MeineProzedur();void * zeigerProzedur()
{
ShowMessage("standardCode");
}void MeineProzedur()
{
ShowMessage("meinCode");
}int main (void)
{
zeigerProzedur = &MeineProzedur;
zeigerProzedur();
}Als Ergebnis soll dann folgendes rauskommen:
"meinCode"
-
sowas?
void zeigerProzedur() { ShowMessage("standardCode"); } void MeineProzedur() { ShowMessage("meinCode"); } int main (void) { void (*p)(void); p = zeigerProzedur; p(); p = MeineProzedur; p(); }
-
Ok, vielen Dank, aber wenn der Funktionszeiger und die Funktion in einer Klasse stecken, geht es nicht mehr.
class TForm1 : public TForm { __published: // Von der IDE verwaltete Komponenten TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // Anwender-Deklarationen public: // Anwender-Deklarationen int (*p)(void); int vProz(void); __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- int TForm1::vProz() { ShowMessage("vProzedur"); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { p = vProz; p(); } //---------------------------------------------------------------------------
Compiler:[C++ Fehler] main.cpp(24): E2235 Elementfunktion muß aufgerufen oder ihre Adresse übernommen werden
Und Visual sagt das:
C:\Programme\Microsoft Visual Studio\MyProjects\jufo_sim1\copengl.cpp(44) : error C2440: '=' : 'int (__thiscall COpenGLWindow::*)(void)' kann nicht in 'int (__cdecl *)(void)' konvertiert werden
-
Hallo
dazu brauchst du das Schlüsselwort __closure. Schau dir mal den TNotifyEvent in der BCB-Hilfe an
bis bald
akari
-
Gast#649237 schrieb:
class TForm1 : public TForm { ... int (*p)(void); ... };
probier mal so:
class TForm1 : public TForm { ... int (TForm1::*p)(); ... };
-
@net: Nein, das funktioniert nicht.
@akari: Der Code soll nicht nur unter Borland laufen, sondern wird dann später in Visual implementiert.
-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum Borland C++ Builder (VCL/CLX) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
void __fastcall TForm1::Button1Click(TObject *Sender) { p = vProz; this->*p(); // <--- & nets Aenderung nicht vergessen } //---------------------------------------------------------------------------
-
du musst eine memberfunktion immer zusammen mit einem objekt aufrufen:
class foo { public: foo() : bar( &foo::baz ) { }; void (foo::*bar)(int a); private: void baz(int a) { std::cout << "foobar" << std::endl; } }; int main() { foo *x = new foo(); (x->*foo->bar)(0); delete x; }
-
camper schrieb:
du musst eine memberfunktion immer zusammen mit einem objekt aufrufen[...]
Nur sofern ich von extern auf die Klasse zugreife.
Beispiel:class meineKlasse { //...Konstruktor usw. ... private: void SetFunctionPointer(); int (*p)(); int stdFunction(); }; void meineKlasse::SetFunctionPointer() { p = stdFunction; }
-
hast du mal versucht, das zu compilieren? bei dir ist p ein ordinärer function pointer, das wird so also kaum funktionieren.
im übrigen habe ich trotzdem recht. die tatsache, dass du dann (s.o.) this nicht explizit angeben musst, heisst ja nicht, dass die funktion nicht trotzdem zusammen mit einem objekt aufgerufen wird. ich hab ja nicht behauptet, dass man es jedesmal dazuschreiben muss.
-
Das ist ja das Problem, dass es sich nicht kompilieren lässt.
Ich will ja auch nur einen "ordinären" Funktionspointer, oder muss man das anders machen???Ich schreib nachher mal ein Beispielprogramm, wie ich mir das vorstelle.
-
Gast#649237 schrieb:
Ich will ja auch nur einen "ordinären" Funktionspointer, oder muss man das anders machen???
Du kennst doch bestimmt diese lustigen Suchbilder, oder? Wenn du hier ganz genau schaust erkennst vielleicht auch du einen Unterschied:
// Variante 1 void bar() { /* ... */ } // Variante 2 void foo::bar() { /* ... */ }
Na, klingelt's?