Funktion mit dynamischem Namen?



  • Sone schrieb:

    Heißt übernehmen Copy&Paste?

    Den komplizierten Teil, ja...



  • DerNoob schrieb:

    Sone schrieb:

    Heißt übernehmen Copy&Paste?

    Den komplizierten Teil, ja...

    Seh da keinen Fehler in dem Coude.



  • ...



  • Kann es sein dass du statt mit freien Funktionen mit Memberfunktionen arbeitest? (Da die Fehlermeldung auf einen pointer to object hinweist)
    Dann musst du dementsprechend statt normalen Funktionspointern Memberfunktionspointer nutzen

    typedef void (KlassenName::*aktion_funktionspointer)(); // funktion_funktionspointer
                              // ist hier ein Memberpointer auf eine Memberfunktion der Klasse Klassenname
                              //die keine Parameter verlangt und void zurückgibt
    aktion_funktionspointer aktion[] = {
        &KlassenName::aktion_mann1,
        &KlassenName::aktion_mann2,
        &KlassenName::aktion_mann3,
      }; // Array aus drei Memberpointern, initialisiert mit Funktionsnamen
    
    (klassenObjekt.*aktion[0])();
    (klassenObjekt.*aktion[1])();
    (klassenObjekt.*aktion[2])();
    

    Ich kann mir jedenfalls vorstellen dass ein Neuling den Unterschied Funktionspointer-Memberfunktionspointer nicht kennt

    Es ist sonst aber auch wichtig zu verstehen, wie man Memberfunktionspointer und Funktionspointer deklariert, notfalls sollte man das eingehend nachlesen. Selbst das Internet via Suchmaschine sollte hier genug sein, gesunder Menschenverstand vorausgesetzt



  • Ich habe die Funktionen außerhalb der main() deklariert & definiert, hier mal der gesamte Code:

    #include <iostream>
    #include <functional> 
    #include <initializer_list> 
    #include <map> 
    #include <string>
    
    using namespace std;
    
    void aktion_mann1(){cout << "Mann 1...";}
    void aktion_mann2(){cout << "Mann 1...";}
    void aktion_mann3(){cout << "Mann 1...";}
    
    int main()
    {
    	int aktion;
    
    	cout << "1 bis 3? ";
    	cin >> aktion;
    
      typedef void (*aktion_funktionspointer)(); 
      aktion_funktionspointer aktion[] = { 
        aktion_mann1, 
        aktion_mann2, 
        aktion_mann3, 
      }; 
    
      // hier die Aktionen aufrufen: 
      aktion[0](); 
      aktion[1](); 
      aktion[2](); // anstatt 2 kann auch "i" oder so stehen 
    
      cout << "\n\n\n";
      system("pause");
    }
    

    0, 1, 2 wird bei mir immer noch unterstrichen...



  • Weil action ein int ist.
    Haste da keinen Fehler drüber gekriegt?
    Nenn das Feld um in actions.



  • DerNoob schrieb:

    int aktion;
      aktion[0](); 
      aktion[1](); 
      aktion[2](); // anstatt 2 kann auch "i" oder so stehen
    


  • Oh, da hätte selbst ich draufkommen können 🙄

    Wenn ich das Spiel, um was es geht
    [Ironie on] mal veröffentlichen werde [Ironie off], seid ihr die Zweiten in den Credits, versprochen 😃



  • ...



  • Swordfish schrieb:

    DerNoob schrieb:

    cout << "Mit wem soll // ...
    

    also immer noch:

    Swordfish schrieb:

    DerNoob schrieb:

    [...]

    Ich glaube eher, du willst ein Array oder einen Vektor von Männern haben ...
    Lies mal Sone's Signatur ...

    Ich bin Anfänger und habe keinen Plan, was Vektoren sind 😉

    Vielleicht schau ich mir's morgen mal an...



  • thomasmann schrieb:

    typedef void (*aktion_funktionspointer)();
      aktion_funktionspointer aktion[] = {
        aktion_mann1,
        aktion_mann2,
        aktion_mann3,
      };
    

    Ich würde auch bei normalen Funktionszeigern den Adressoperator hinschreiben, wegen der Klarheit und Einheitlichkeit mit Memberfunktionszeigern. Keine Ahnung, warum man es in C dazumals für sinnvoll hielt, & weglassen zu können...


  • Mod

    Klaubi schrieb:

    Ich würde auch bei normalen Funktionszeigern den Adressoperator hinschreiben, wegen der Klarheit und Einheitlichkeit mit Memberfunktionszeigern.

    Ich würde sie weglassen. Aus dem gleichen Grund.


Anmelden zum Antworten