Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit zwei Klassen und Zeigern

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 < [ 2 ]
000
14.08.2006, 11:49 Uhr
FunnyDingo



Hallo zusammen,

ich habe ein Problem zu dem ich schon mal gelesen habe, "es sei nicht möglich". Vielleicht simmt das sogar, daher würde ich gerne mal genau nachfragen.

Situation:
Ich habe zwei Klassen. Die Klasse "benutzer" und die Klasse "raum". Die Klasse benutzer beinhaltet eine Zeiger auf ein raum-Objekt. Nun kommt das Problem. Die Klasse raum beinhaltet einen Vector mit einer Liste aller benutzer die sich in diesem raum befinden.

Und dies lässt sich nicht kompilieren. (class benutzer ist Bestand von class raum und anders rum). Meine einzige Idee wäre: benutzer und räume werden mit IDs versehen (unsigned int) und ich benutze keine Zeiger auf die Objekte direkt, sondern nur diese IDs.

Aber vielleicht kennt ja jemand von euch einen "geheimen Tipp" mit dem man das machen könnte? Ich dachte schon an einen void-Zeiger den ich dann immer via TypCasting auf die richtige verwendung vorbereite.

Bin auf eure Meinung gespannt.

Gruß,
FunnyDingo
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.08.2006, 12:32 Uhr
ao

(Operator)


Kleiner Verständnisfehler: raum ist *nicht* Bestandteil von benutzer. Es ist eine Zeiger-Beziehung, d.h. zum Kompilieren von benutzer muss nur der Name "raum" bekannt sein, aber nicht der innere Aufbau.

benutzer.h:

C++:
// kein #include "raum.h" !
class raum; // "forward"-Deklaration macht den Namen bekannt

class benutzer
{
    raum * meinRaum;
    // Verwendung von *meinRaum ist in benutzer.h nicht möglich.
    // Alle Zugriffe auf Member von *meinRaum nach benutzer.cpp verschieben.
};



benutzer.cpp:

C++:
#include "benutzer.h"
#include "raum.h"
// ab hier kann alles aus der Klasse raum benutzt werden.

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.08.2006, 12:38 Uhr
ao

(Operator)


Außerdem ist es glaub ich ein Fehler, dass der Raum einen Vektor von Benutzern hat. Es sollte ein Vektor von Referenzen oder Zeigern auf Benutzer sein. Sonst wären die Benutzer Bestandteile des Raums, aber das sind sie in Wahrheit nicht, denn sie können ihn verlassen, oder?

Also

C++:
class benutzer; // forward reicht hier auch, weil nur die Referenz gebraucht wird.
class Raum
{
    std::vector<benutzer &> meineBenutzer;
};

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.08.2006, 12:41 Uhr
Th



Das gesuchte Stichwort heißt Vorwärtsdeklaration ("forward declaration"):
so können sich zwei Klassen gegenseitig referenzieren.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.08.2006, 12:48 Uhr
FunnyDingo



Super, das hört sich sehr gut an - werde ich gleich mal ausprobieren. Was ich nur nicht verstanden habe:

Warum include ich raum.h in der benutzer.cpp und nicht in der benutzer.h?


Zitat von ao:
Außerdem ist es glaub ich ein Fehler, dass der Raum einen Vektor von Benutzern hat. Es sollte ein Vektor von Referenzen oder Zeigern auf Benutzer sein. Sonst wären die Benutzer Bestandteile des Raums, aber das sind sie in Wahrheit nicht, denn sie können ihn verlassen, oder?

Also

C++:
class benutzer; // forward reicht hier auch, weil nur die Referenz gebraucht wird.
class Raum
{
    std::vector<benutzer &> meineBenutzer;
};



Korrekt, das habe ich auch so gemacht (bzw. ist es bei mir ein Vector von Zeigern), habe das nur vorhin beim schreiben irgendwie vergessen - sorry
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de

Dieser Post wurde am 14.08.2006 um 13:32 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.08.2006, 13:25 Uhr
ao

(Operator)



Zitat von FunnyDingo:
Warum include ich raum.h in der benutzer.cpp und nicht in der benutzer.h?

Weil in benutzer.cpp die Bestandteile des Raums (->Memberfunktionen) verwendet werden, und dafür muss bekannt sein, welche public-Member es gibt. Du musst also die Deklaration class raum { .... }; bekannt machen, wobei das, was zwischen den Klammern steht, wichtig ist. Du erreichst das durch #include "raum.h", was genauso wirkt, als hättest du den Inhalt des Files dorthin kopiert, wo die #include-Anweisung steht.

In benutzer.h (Definition der Klasse benutzer) wird festgelegt, dass benutzer eine Beziehung zu raum-Instanzen hat. Dazu muss nur der Klassenname raum eingeführt werden. Über Innenleben und Schnittstelle der Klasse (also das Zeug zwischen den Klammern) braucht man hier noch nichts zu wissen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.08.2006, 13:34 Uhr
FunnyDingo



Achso, ich habe bisher immer alle includes in das Header-File gemacht und in der CPP nur das Header-File included...

Noch was zu den Vectoren mit Referenzen:
Ein Vector mit Refernzen scheint nicht zu gehen. Das folgende Programm kann nicht kompiliert werden - bekomme wilde Fehlermeldungen.

C++:
#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char* argv[]) {
    
    vector<int &> list;
    return 0;
}

--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.08.2006, 13:56 Uhr
ao

(Operator)



Zitat von FunnyDingo:
Noch was zu den Vectoren mit Referenzen:
Ein Vector mit Refernzen scheint nicht zu gehen.

Oh, stimmt. Die vector-Klasse arbeitet intern mit einem Pointer auf den übergebenen Typ, und Pointer auf Referenzen sind nicht möglich. Dann musst du wohl einen Vektor von Zeigern machen, aber das kannst du ja verbergen.

Am alle: Ist das bei der STL allgemein so, dass Container mit Referenzen nicht gehen, oder haben wir hier einen Fehler in der Microsoft-Implementierung?

ao

Dieser Post wurde am 14.08.2006 um 13:57 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.08.2006, 14:00 Uhr
FunnyDingo




Zitat von ao:
Am alle: Ist das bei der STL allgemein so, dass Container mit Referenzen nicht gehen, oder haben wir hier einen Fehler in der Microsoft-Implementierung?


Wohl kaum, da ich hier mit dem GNU-Compiler arbeite.
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
14.08.2006, 14:41 Uhr
FunnyDingo



Okay, nun bin ich ganz durcheinander.

Ich wollte gerade durch einen Vector mit Pointern interieren doch leider klappte das nicht so ganz. Also habe ich ein wenig bei google gesucht und dies gefunden:

Zitat:
Don't use pointers to elements in Vectors. Pointers to elements in vectors tend to get "stale", because vectors reallocate themselves if they grow, so you'd eventually end up dereferencing wild pointers and crashing your program.
.

Nun mache ich unter anderem folgendes (aus dem kopf):

C++:
bool benutzerDB::NeuerBenutzer() {
  // Suchen des benötigten Raums, rückgabe ist ein Zeiger...
  //...
  benutzer b;
  b.raum(aktuellerRaum);
  aktuellerRaum->neuerBenutzer(&b);
  benutzerliste.push_back(b);
  return true;
}


Ist das logisch überhaupt korrekt?
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de

Dieser Post wurde am 14.08.2006 um 14:47 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


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: