Gegenseitiger Zugriff von zwei Klassen in verschiedenen .h und .cpp Dateien

MRPSV

Grünschnabel
hi
Ich weiß die Frage wurde schonmal gestellt aber leider nicht beantwortet.
Ich möchte das zwei Klassen jeweils einen Zeiger auf die andere Klasse besitzen für den gegenseitigen Zugriff. Aber dabei soll die Klassendeklaration in der .h der jeweiligen Klasse stehen und die Definition in der .cpp Datei.

Code:
//klasse.h
#ifndef _KLASSE_H
#define	_KLASSE_H

class klasse2;

class klasse {
public:
    klasse();
    void zweitemal();
private:
    klasse2* kl2;
};

#endif

//klasse.cpp
#include "klasse.h"
#include <stdio.h>
#include <iostream>
#include "klasse2.h"

using namespace std;

klasse::klasse() {
    cout<<"klasse1"<<endl;
    kl2 = new klasse2(this);
    //kl2.zweitemal();
    //kl2.test = 3;
}

void klasse::zweitemal() {
    cout<<"klasse1 zweite ausführung"<<endl;
}

//klasse2.h
#ifndef _KLASSE2_H
#define	_KLASSE2_H

class klasse;

class klasse2 {
public:
    klasse2(klasse* pkl);
    void zweitemal();
    int test;
private:
    klasse* kl1;
};

#endif

//klasse2.cpp
#include "klasse2.h"
#include "klasse.h"
#include <stdio.h>
#include <iostream>

using namespace std;

klasse2::klasse2(klasse* pkl) {
    kl1 = pkl;
    cout<<"klasse2"<<endl;
    //kl1.zweitemal();
}
void klasse2::zweitemal() {
    cout<<"klasse2 zweite ausführung"<<endl;
}

//main.cpp
#include <stdio.h>
#include <iostream>
#include "klasse.h"

using namespace std;

int main(int argc, char** argv) {
    cout<<"start"<<endl;
    klasse kl1;
    return (EXIT_SUCCESS);
}

Den Teil habe ich bis jetzt soweit hinbekommen und er funktioniert auch so wie er sollte. Aber das was ich in den Kunstruktoren auskommentiert habe funktionert nicht. Beim Zugriff auf die Membervariable "test" sagt er mir das er diese nicht finden kann und beim Zugriff auf die Memberfunktion sagte er "'zweitemal' is not a type"...denke mal das heißt auch soviel wie dass er das nicht finden kann.
Aber woran liegt das Problem? In VC++ hat das auf diese Weise funktioniert. Jetzt benutze ich aber Netbeans mit dem gcc Compiler.
 
Aber woran liegt das Problem? In VC++ hat das auf diese Weise funktioniert. Jetzt benutze ich aber Netbeans mit dem gcc Compiler.
Ich bezweifle, dass VC++ diesen Code ohne Probleme kompiliert hat. In den auskommentierten Zeilen versuchst du auf einen Zeiger zuzugreifen, als wäre es ein Objekt. Probier es also mal mit "->" statt ".". Die Fehlermeldungen, die du zitierst, kann ich mir in dem Zusammenhang auch nicht vorstellen. Vermutlich hast du irgendetwas falsch interpretiert. Von daher das nächste mal einfach die Fehlermeldung 1:1 posten und nichts umschreiben, das ist nicht zielführend.

Grüße, Matthias
 
Zuletzt bearbeitet:
Ouh ganz blöder Fehler. Ja es war der "->". Es hat bei VC++ funktioniert weil ich ihn dort verwendet hatte. Ich hatte das mal so gelernt das sich der VC++ Compiler dadurch von den anderen unterscheidet das bei ihm die Objekte mit "^" erstellt und mit "->" darauf zugegriffen wird. Ich dachte das bei gcc und anderen immer auf Objekte egal ob Zeiger oder nicht mit "." darauf zugegriffen wird. Zumindest sind die Fehlermeldungen jetzt weg.
Naja jetzt bin ich schlauer ;)
thx Matthias
 
Zurück