Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Verschachtelte Klassen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.05.2003, 12:17 Uhr
~Michael
Gast


Moinmoin,

ich hoffe die Überschrift ist passend zu meinem Problem, mir fiel halt nix besseres ein.

Wie dem auch sei, hier einfach mal mein Problem anhand eines Beispiels:

class A
{
B* b
}

class B
{
A* a
}

Dies führt ja nun unweigerlich zu einer Fehlermeldung, da je nachdem, was zuerst deklariert wird, eine der Klassen mit ihrem Zeiger nix anfangen kann. Wie kann ich das Problem lösen?
Sollte es irgendwas mit void Pointern zu tun haben, dann bitte eine genaue Erklärung, denn der Begriff als solches ist mir schon paar Mal in diesem Zusammenhang genannt worden. Allerdings konnte ich dat nicht so recht umsetzen.

Danke für schnelle und gute Anworten, und alle andedren auch
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.05.2003, 14:22 Uhr
Christian
C/C++ Master
(Operator)


Hi!

So kannst du es machen:


C++:

[b]class B;[/b] // Vorrausdeklaration

class A
{
    B* b;
};

class B
{
    A* a;
};



Du teilst mit der Vorrausdeklaration dem Compiler ja nur mit, dass es sich bei B um eine Klasse handelt. Jetzt kannst du auch einen Pointer auf diese Klasse in A definieren.
Was allerdings nicht klappt ist in A eine Instanz von B zu setzen, denn der Compiler weiß ja nur, dass es sich um eine Klasse handelt (deshalb funktioniert ein Pointer), hat aber keine Ahnung über den Aufbau der Klasse.
--
Grüße, Christian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.05.2003, 14:29 Uhr
~Michael
Gast


Damit ist mir ja aber nicht so viel geholfen. Ich will ja den Pointer nicht in die Klasse setzen, nur um da einen Pointer zu haben :p.
Klassen A und B sind vielmehr 2 sehr eng zusammenarbeitende Klassen, die sich gegenseitig stark beeinflussen. Deswegen habe ich die Pointer gesetzt, damit sich Methodedn der einen Klasse auf die andere auswirken können.
Aber immerhin: Die Fehlermeldungen sind von 408 auf 26 zurückgegangen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.05.2003, 14:50 Uhr
Spacelord
Hoffnungsloser Fall


Du kannst doch in der Implementierung deines A Konstruktors deinem B Zeiger dann per new ein b Objekt zuweisen.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.05.2003, 15:28 Uhr
~Michael
Gast


Wie denn? In dem Moment, in dem der Compiler durch die Klasse A durchgeht (nach meinem obersten Beispiel) hat er doch noch überhaupt keinen Plan, was denn B ist. Deswegen haut er dann eine Fehlermeldung nach der nächsten raus.
Wenn ich Christians Tip befolge, dann kann ich zwar einen Zeiger auf B setzen, aber der Compiler weiss überhaupt noch nicht, wie gross das Objekt ist, und kann daher auch keine Instanz bilden.

Das is ja des!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.05.2003, 19:30 Uhr
Spacelord
Hoffnungsloser Fall


Hier ein kleines Beispiel.
Insgesamt solltest du dir aber Gedanken über dein Klassendesign machen.Gegenseitig abhängige Klassen sin unschön und bringen nur Probleme mit sich.

C++:
//A.h
#ifndef A_H
#define A_H

class B;

class A
{
    
public:
    A();
    B* b;
    char* name;
};

#endif


//B.h
#ifndef B_H
#define B_H

class A;

class B
{
private:
    A* a;
public:
    char* name;
    B(A*,char*);
};

#endif


//A.cpp
#include "A.h"
#include "B.h"


A::A()
{
    name = "Ich bin A";
    b = new B(this,"Ich bin ein B aus A");
}


//B.cpp
#include "B.h"
#include "A.h"

B::B(A* aktA,char* text)
{
    a=aktA;
    name =text;
}



//main cpp
#include "A.h"
#include "B.h"
#include <iostream>
using namespace std;


int main()
{
    A* meinA = new A;
    cout<<meinA->name<<endl;
    cout<<meinA->b->name<<endl;
    
    return 0;
}


MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: