Zeiger auf Memberfunktionen



  • Guten Tag,
    ich habe folgendes Problem. Wir sollen eine Klasse entwickeln, die einen Funktionszeiger enthält, der auf die Memberfunktionen der Klasse zeigt. Zudem soll es eine Funktion geben, mit der man den Zeiger auf eine andere Memberfunktion zeigen lassen kann. Soweit habe ich das Ganze nun realisiert, doch beim Compilen wird mir die Fehlermeldung Zugriffsverletzung ausgegeben,an der Stelle, wo der Funktionszeiger die Funktion, auf die er zeigt, ausführen soll. Ich habe die letzten Tage jetzt probiert herauszufinden, woran es liegt, bin aber zu keinem Ergebnis gekommen. Vielleicht könnt ihr mir ja weiterhelfen. Besten Dank. Achso, falls es eine andere Möglichkeit gibt, den Quellcode im Beitrag einzufügen, wäre ich dankbar, wenn man mir das mitteilen würde.

    #include "stdafx.h"
    #include<iostream>
    using namespace std;
    
    #ifndef M_PI
    #define M_PI 3.1415926535897932
    #endif
    
    enum Farben { rot, gelb, gruen, blau };
    
    struct Kreis {
    	double x, y, r;
    	Farben farbe;
    };
    struct Quadrat {
    	double x, y, r;
    	Farben farbe;
    };
    
    class Formen {
    
    private:         Kreis kreis;
    		 Quadrat quadrat;
    
    		 double berechneFlaecheKreis() {
    			 double flaecheK = M_PI*kreis.r*kreis.r;
    			 return flaecheK;
    		 };
    
    		 double berechneFlaecheQuadrat() {
    			 double flaecheQ = quadrat.x*quadrat.y;
    			 return flaecheQ;
    		 };
    
    		 decltype(&Formen::berechneFlaecheKreis) pfnFunc;                                        //Erstellung des Pointers und Zuweisung
    
    public:
    
    	Formen::Formen(double a, double b, double c, double d, double e, double f ):
    		kreis(),quadrat() {
    		kreis.r = a;
    		kreis.x = b;
    		kreis.y = c;
    		quadrat.r = d;
    		quadrat.x = e;
    		quadrat.y = f;
    	}
    
    	void wechsleBerechnungsart() {                                                                     //Funktion um Pointerzuweisung zu ändern
    		if (pfnFunc == &Formen::berechneFlaecheQuadrat) {
    			pfnFunc = &Formen::berechneFlaecheKreis;
    		}
    		else
    		{
    			pfnFunc = &Formen::berechneFlaecheQuadrat;
    		};
    
    	};
    
    	void berechne Flaeche() {                                                                 //Funktion zur Ausführung der Funktion auf die der Pointer zeigt
    		(this->*pfnFunc)();                                                              //Stelle der Fehlermeldung: Zugriffsverletzung
    	};
    
    };
    


  • beim Compilen wird mir die Fehlermeldung Zugriffsverletzung

    Wenn der Fehle tatsächlich beim Übersetzen auftritt: Copy&Paste der Meldung.
    Ich vermute aber eher, dass das Programm bereits läuft und abstürzt.

    Du zeigst kein Minimalbeispiel, niemand kann den Fehler nachvollziehen.
    pfnFunc wird im Konstruktor nicht gesetzt und zeigt daher auf irgendwas. Möglicherweise ist das das Problem.

    Generell: Benutze Codetags. So liest sich das keiner wirklich durch.



  • 1. Bitte Code-tags verwenden.

    2. Benutze in C++ doch std::function<>. Erleichtert das ganze ungemein.



  • gg125 schrieb:

    decltype(&Formen::berechneFlaecheKreis) pfnFunc;                                        //Erstellung des Pointers und Zuweisung
    

    Hallo,

    da wird nichts zugewiesen.



  • Vielen Dank für die schnellen Antworten.
    Ich habe das Problem gefunden, wie ihr gesagt habt, hat die Zuweisung im Konstruktor gefehlt, danach funktionierte
    es problemlos.
    Vielen Dank nochmal.


Anmelden zum Antworten