Funktionspointer



  • Hi!

    Meine Klasse:

    class CCutscene
    {
    private:
    	BITMAP * tempBuffer;
    	BITMAP * backBuffer;
    public:
    	CCutscene ();
    	~CCutscene ();
    
    	void (*showScene[1]) ();
    	void testScene () {};
    };
    

    Konstruktor und Destruktor:

    CCutscene::CCutscene()
    {
    	tempBuffer = create_bitmap(SCREEN_X, SCREEN_Y);
    	backBuffer = create_bitmap(SCREEN_X, SCREEN_Y);
    
    	showScene[0] = testScene();
    };
    
    CCutscene::~CCutscene()
    {
    	destroy_bitmap (tempBuffer);
    	destroy_bitmap (backBuffer);
    };
    

    Folgende Fehlermeldung:

    error C2440: '=': 'void' kann nicht in 'void (__cdecl *)(void)' konvertiert werden
            Ausdruck vom Typ void kann nicht in andere Typen konvertiert werden
    

    Jetzt meine Frage:

    Wie weise ich dem Funktionspointer showScene eine Funktion zu ?

    MfG



  • versuchs mal so:

    struct fp
    {
      void (*ShowScene)() ptr;
    }
    
    class c
    {
    private:
      fp m_FPArray[1];
    }
    
    //constructor:
    m_FPArray[0].ptr = irgendwas;
    


  • Aber das "Array von Pointern auf Funktionen, die nix übernehmen und void zurückgeben" muss man doch nutzen können. Oder nicht?

    MfG



  • es geht glaub ich auch mit typedefs, aber da weiß ich jetzt ncihts genaueres



  • Hallo,
    also erstmal müsste das:

    showScene[0] = testScene();
    

    natürlich:

    showScene[0] = &testScene;
    

    heißen. Du willst schließlich nicht das Ergebnis des Funktionsaufrufs zuweisen, sondern einen Zeiger auf die Funktion bilden.

    Nun machst du aber noch einen Denkfehler.
    testScene ist eine Memberfunktion der Klasse CCutscene und keine freie Funktion. Ihr Typ ist deshalb nicht void ()() sondern vielmehr void (CCutscene::)().

    Die Deklaration deines Arrays muss also so aussehen:

    void (CCutscene::* showScene[1]) ();
    

    und die Zuweisung so:

    showScene[0] = &CCutscene::testScene;
    


  • Danke!

    showFunction[0] = testFunction;
    

    ist richtig. Da das schon als Adresse behandelt wird.

    MfG



  • Saiyaman schrieb:

    showFunction[0] = testFunction;
    

    ist richtig. Da das schon als Adresse behandelt wird.

    1. Steht das so nicht in deinem ersten Beitrag (vielleicht nochmal genau hinschauen).

    2. Gilt das nur für freie Funktionen. Bei Memberfunktionen muss der Adress-Operator benutzt werden. Es gibt zwar Compiler, die das weniger genau nehmen, dass ist dann aber eine Erweiterung, die selbstverständlich nicht Standard ist.



  • showFunction[0] = testFunction(); // Fehler
    showFunction[0] = &testFunction(); // Fehler
    showFunction[0] = &testFunction; // Fehler
    showFunction[0] = testFunction; // Richtig!
    

    Ma was anderes. Ich hab ein Objekt dieser Klasse in einer anderen Klasse deklariert.

    class CSingleplayer
    {
    private:
    CCutscene cutscene;
    ...
    };
    

    Wenn ich nun aber innerhalb einer Methode auf cutscene zurückgreife:

    cutscene.showScene[0]();
    

    kommt folgende Fehlermeldung:

    error C2064: Ausdruck ergibt keine Funktion, die 0 Argumente übernimmt
    

    Warum?

    MfG



  • (cutscene.*showScene[0])();
    


  • error C2065: 'showScene': nichtdeklarierter Bezeichner
    

    😕

    MfG



  • also... bei dir müsste es ungefähr so aussehen:

    struct A {
    	void foo() { }
    	void foo1() { }
    };
    
    void (A::*fooarr[2]) () = { A::foo,A::foo1 };
    
    A a;
    (a.**fooarr)();
    


  • Ich Idiot! 😃

    Der Funktionspointer muss in CSingleplayer und nich in CCutscene deklariert und initialisiert werden.

    Nun geht alles.

    MfG


Anmelden zum Antworten