Ausgelöste Ausnahme: Lesezugriffsverletzung



  • Hallo zusammen,
    nachdem ich schon länger still hier mitlese, muss ich nun auch mal eine Frage stellen und hoffe, dass ihr mir helfen könnt.

    Im Rahmen einer Übung für die Uni habe ich einen Quellcode vorgegeben bekommen, den ich um bestimmte Funktionen ergänzen soll. Dabei habe ich zwei Klassen (Klasse A und Klasse 😎 und möchte innerhalb einer Funktion von KlasseB auf den Inhalt einer KlasseA Variable zugreifen.

    Dabei erhalte ich immer den Fehler:
    Ausgelöster Ausnahmefehler: Lesezugriffsverletzung

    "this" war "nullptr".

    Dabei zeigt er auf folgende Zeilen:
    "int KlasseA::geta() {
    return a;"

    Das hier ist nicht der Originalcode sondern soll nur meinen Fehler reproduzieren. Bevor hier noch gemeckert wird, dass ich euch meine Aufgaben machen lassen würde. 😃

    #include <iostream>
    using namespace std;
    
    class KlasseA {
    
    private:
    	int a, b, c;
    public:
    	// Konstruktor
    	KlasseA();
    	int geta();
    	int getb();
    	int getc();
    };
    
    KlasseA::KlasseA() {
    	a = 10;
    	b = 20;
    	c = 30;
    }
    
    int KlasseA::geta() {
    	return a;
    }
    int KlasseA::getb() {
    	return b;
    }
    int KlasseA::getc() {
    	return c;
    }
    
    class KlasseB {
    private:
    	int d;
    public:
    	// Klasse A als Informationsquelle
    	KlasseA *KLA;
    	KlasseB();
    	int getabcd();
    };
    
    KlasseB::KlasseB() {
    	d = 40;
    }
    
    int KlasseB::getabcd() {
    
    	//Rückgabe: a + b + c + d
    	int a, b, c;
    
    	// Hier möchte ich auf den Inhalt der KlasseA
    	// Variablen über die get-Funktionen zugreifen.
    
    	a = KLA->geta();
    	b = KLA->getb();
    	c = KLA->getc();
    
    	return (a+b+c+d);
    }
    
    int main() {
    
    	KlasseA KLA;
    	KlasseB KLB;
    	cout << KLB.getabcd() << endl;
    	getchar();
    
    }
    

    Ich hoffe ihr könnt mir helfen, ich verzweifle schon!

    lieben Gruß
    Alex



  • Dein Problem ist hier, dass du keine KlasseA-Instanz hast, sondern nur einen Zeiger. Den initialisierst du nirgendwo und kann also auf jeden beliebigen Speicherbereich zeigen, auch 0.
    Entweder du sorgst dafür, dass der Zeiger auch auf eine KlasseA-Instanz zeigt oder besser, du lässt das mit dem Zeiger und legst gleich eine richtige Instanz an:

    KlasseA KLA;
    


  • Wenn ich innerhalb der Klasse B nun eine Instanz der Klasse A erzeuge, funktioniert das ganze schon mal. Leider muss ich mich an die Vorgaben halten und diese sieht den Zeiger auf die Instanz vor.

    KlasseA *KLA;
    

    Ist es möglich diesen Zeiger auf die in der Mainfunktion deklarierte Instanz "KLA" zeigen zu lassen? Und wenn ja, wie geht man dann am besten vor ?

    Vielen Dank schon mal für deine Hilfe!



  • Wie lässt man allgemein einen Zeiger auf etwas zeigen?



  • Allgemein zum Beispiel ein Zeiger auf Integer:

    int *ptr;

    Diesen würde ich dann initialisieren in dem ich ihm eine Speicheradresse zuweise:

    int a;
    ptr = &a

    In diesem Fall die Speicheradresse von a.



  • Dann wende das auf deinen Fall an.



  • Das ist so nicht optimal. Der Speicher an der Adresse ist nur so lange definiert, wie das Objekt dessen Speicheradresse zugewiesen wurde, existiert. Also nur die Funktion lang. Aber in einem Klassenmember will man die Daten üblicherweise länger vor halten.

    Such mal nach new()



  • Also ich habe mich nun mal daran versucht, die Instanz, die ich mit der KlasseA erstellt habe, bei der Erstellung von Instanz der KlasseB mitzuliefern. In Zeile 50 versuche ich dann den Zeiger zu initialisieren.

    Leider scheint das auch nicht so ganz zu funktionieren.

    #include <iostream>
    using namespace std;
    
    class KlasseA {
    
    private:
    	int a, b, c;
    public:
    	// Konstruktor
    	KlasseA();
    	int geta();
    	int getb();
    	int getc();
    };
    
    KlasseA::KlasseA() {
    	a = 10;
    	b = 20;
    	c = 30;
    }
    
    int KlasseA::geta() {
    	return a;
    }
    int KlasseA::getb() {
    	return b;
    }
    int KlasseA::getc() {
    	return c;
    }
    
    class KlasseB {
    private:
    	int d;
    	KlasseA *KLA;
    public:
    	// Klasse A als Informationsquelle
    	KlasseB(KlasseA *KLSA);
    	int getabcd();
    };
    
    KlasseB::KlasseB(KlasseA *KLSA) {
    
    	// Hier "versuche" ich die Initialisierung
    	//
    	KLA = &KLSA;
    
    	d = 40;
    }
    
    int KlasseB::getabcd() {
    
    	//Rückgabe: a + b + c + d
    	int a, b, c;
    
    	// Hier möchte ich auf den Inhalt der KlasseA
    	// Variablen über die get-Funktionen zugreifen.
    
    	a = KLA->geta();
    	b = KLA->getb();
    	c = KLA->getc();
    
    	return (a+b+c+d);
    }
    
    int main() {
    
    	KlasseA KLSA;
    	KlasseB KLSB(&KLSA);
    	cout << KLSB.getabcd() << endl;
    	getchar();
    
    }
    


  • KLA = &KLSA;
    

    Warum &?



  • Aah, ich habs glaube ich:

    KlasseB::KlasseB(KlasseA *KLSA) {
    
        // Hier "versuche" ich die Initialisierung
        //
        KLA = KLSA;
    
        d = 40;
    }
    

    So scheint es zu funktionieren, danke für deine Hilfe!


Anmelden zum Antworten