Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

11

04.02.2007, 20:24

Klasse1.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#pragma once

class Klasse2;

class Klasse1
{
private:
    Klasse2* pKlasse1;

public:
    // ...

};


Klasse2

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#pragma once

class Klasse1;

class Klasse2
{
private:
    Klasse1* pKlasse1;

public:
    // ...

};


Das wären also die deklarationen nu weiter mit der Definition.

Klasse1.cpp

C-/C++-Quelltext

1
2
3
4
#include "Klasse1.hpp"
#include "Klasse2.hpp" 

// ...


Klasse2.cpp

C-/C++-Quelltext

1
2
3
4
#include "Klasse2.hpp"
#include "Klasse1.hpp"

// ...


Wie bereits gesagt spricht man hierbei von Forwarddeclarations. Du musst halt immer schön Objekte im Freestore anlegen auf die gezeigt werden kann und dich um die freigabe derer kümmern.
Alternativ kannst du aber auch einfach Smartpointer verwenden, z.B. std::auto_ptr.

Das ganze klappt weil der Compiler wärend des Compiliervorgangs noch nicht die Definition der Objektklasse kennen müssen, falls es sich um einen Zeiger handelt. Bei Objekten auf dem Stack sieht das anders aus, die müssen initialisiert werden. Darum muss die Größe bekannt sein (vorherige Definition is notwendig).

grüße
@D13_Dreinig

12

04.02.2007, 20:38

Zitat von »"Eisbär"«

also, zur Verdeutlichung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
//Klasse1.hpp, Prototypen, Funktionen in Klasse1.cpp

#include "CKlasse2.hpp"
#include "Eigenedefines.hpp"
#if !defined CKLASSE_HPP
#define CKLASSE_HPP
class CKlasse1
{
// tu dies, jenes, sell

}
#endif


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
//Klasse2.hpp, Prototypen, Funktionen in Klasse2.cpp

#include "CKlasse1.hpp"
#include "Eigenedefines.hpp" // irgendwelche defines, für bestimmte Werte

#if !defined CKLASSE2_HPP
#define CKLASSE2_HPP
class CKlasse2
{
// tu jenes, selles, irgendebbes

}
#endif


lol das kommt in meine Sammlung an Endlsoschleifen ^^

Ne mal ernsthaft es liegt daran das du bei der klasse1 Klasse2 einbindest, dort wird wieder Klasse1 eingebunden welche wieder Klasse2 einbindet usw.

Du müsstest das

C-/C++-Quelltext

1
2
#if !defined CKLASSE2_HPP
#define CKLASSE2_HPP

einfach nur ganz an den Anfang der Datei packen und dein Problemhätte sich erledigt. Davids Variante funktiniert natürlich genauso gut.

PS: das mit dem lol ist nicht so ernst gemeint ich freu mich halt nur immer über neue Variationen von Endlosschleifen und auf diese bin ich noch nicht gekommen :)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

13

04.02.2007, 20:58

Das klappt aber nur so lange er keine, in der jeweils anderen Datei definierten, Funktionalitäten verwenden will.
@D13_Dreinig

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

14

05.02.2007, 11:15

Anmerkung: Mir ist kein Modellierungsfall bekannt, in dem zwei Klasse jeweils Bestandteil der anderen Klasse sind.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

15

05.02.2007, 11:39

Zitat von »"Nox"«

Anmerkung: Mir ist kein Modellierungsfall bekannt, in dem zwei Klasse jeweils Bestandteil der anderen Klasse sind.


Und deshalb sollte dieser Fall niemals auftreten? Der Fall mag dir evtl nicht bekannt sein, aber geben tuts ihn sonst würde kein Problem in diesem Zusammenhang bestehen.

grüße
@D13_Dreinig

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

16

06.02.2007, 15:02

Damit wollte ich eigentlich erreichen, dass mir einer ein paar Beispiele für diesen Fall aufzählt :D . Ich kenne nur solche sachen, wo die eine Klasse sich in der anderen eintragen muss, aber da nutzt man ja sowieso Zeiger. Ich meinte also den Fall der gegenseitigen Aggregation. Für Beispiele(für diesen speziellen Fall) wäre ich dankbar ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

17

06.02.2007, 15:20

Spontan fällt mir kein wirklich gutes Beispiel ein. Das ganze bezeichnet man aber als pimpl (pointer to implementation) idiom. Kannst ja mal googlen ob du gute Beispiele für findest. :)
Das ganze nutzt man u.A. auch um die Kompilierzeit zu minimieren.
@D13_Dreinig

Werbeanzeige