Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
magynhard Super JLI'ler
Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 10.09.2005, 12:59 Titel: Klassen bekannt machen?! |
|
|
Ich bin auf folgendes Problem gestoßen (vereinfacht dargestellt):
CPP: | class KlasseA
{
public:
KlasseA() { };
~KlasseA() { };
private:
KlasseB * m_klasseb;
};
class KlasseB
{
public:
KlasseB() { };
~KlasseB() { };
private:
KlasseA * m_klassea;
};
|
Das Anlegen des KlasseB-Zeigers in KlasseA funktioniert leider nicht, da diese erst darunter dem Kompiler bekannt gemacht wird.
Ist es bei Klassen, vergleichbar wie bei Funktionen, möglich, diese mit einer Art Prototyp bekannt zu machen, und wenn ja, wie? _________________ Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
|
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 10.09.2005, 13:50 Titel: |
|
|
über die definition von KlasseA schreiben, dies sollte genügen. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 10.09.2005, 14:30 Titel: |
|
|
Eine simple Vorwärtsdeklaration.
Knifflig und interessant wirds, wenn beide Klassen Methoden der jeweils anderen verwenden. |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 10.09.2005, 15:10 Titel: |
|
|
GreveN hat Folgendes geschrieben: | Eine simple Vorwärtsdeklaration.
Knifflig und interessant wirds, wenn beide Klassen Methoden der jeweils anderen verwenden. |
Du wirst deine Implementationen doch wohl nicht im Header machen, oder? _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 10.09.2005, 15:16 Titel: |
|
|
Kommt darauf an.
Templates, Inlines, Statics tun ihr übriges. |
|
Nach oben |
|
|
magynhard Super JLI'ler
Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 11.09.2005, 09:24 Titel: |
|
|
Ja, so etwas in der Art will ich auch bauen.
Doch leider gibt's da ein Problem, dass ich nicht (er-)kenne.
CPP: | class KlasseA;
class KlasseB;
class KlasseC;
class KlasseC
{
public:
KlasseC() { };
~KlasseC() { };
void GebeZeiger(KlasseB * zeiger) { m_klasseb = zeiger; m_wert = m_klasseb->HoleWert(); };
private:
KlasseB * m_klasseb;
int m_wert;
};
class KlasseB
{
public:
KlasseB() { };
~KlasseB() { };
void GebeZeiger(KlasseB * zeiger) { m_klasseb = zeiger; };
int HoleWert() { return m_wert; };
void ErstelleKlasseC()
{
m_klassec = new KlasseC;
m_klassec->GebeZeiger(m_klasseb);
}
private:
KlasseC * m_klassec;
KlasseB * m_klasseb;
int m_wert;
};
class KlasseA
{
public:
KlasseA() { };
~KlasseA() { };
void ErstelleKlasseB()
{
m_klasseb = new KlasseB;
m_klasseb->GebeZeiger(m_klasseb);
}
private:
KlasseB * m_klasseb;
};
|
Mein Kompiler schreit bei
CPP: | m_wert = m_klasseb->HoleWert();
|
Code: |
error: invalide use of undefined type 'struct KlasseB'
error: forward declaration of struct 'struct KlasseB'
|
Ohne genannte Anweisung geht's fehlerfrei, aber die benötige ich ja.
Ich mag wohl blind sein?
Wer weiß Rat? _________________ Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
|
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 11.09.2005, 09:34 Titel: |
|
|
es sollte eher so ausschauen:
CPP: | class KlasseB;
class KlasseC
{
public:
KlasseC() { };
~KlasseC() { };
void GebeZeiger(KlasseB * zeiger);
private:
KlasseB * m_klasseb;
int m_wert;
};
class KlasseB
{
public:
KlasseB() { };
~KlasseB() { };
void GebeZeiger(KlasseB * zeiger) { m_klasseb = zeiger; };
int HoleWert() { return m_wert; };
void ErstelleKlasseC()
{
m_klassec = new KlasseC;
m_klassec->GebeZeiger(m_klasseb);
}
private:
KlasseC * m_klassec;
KlasseB * m_klasseb;
int m_wert;
};
void KlasseC::GebeZeiger(KlasseB* zeiger)
{
m_klasseb = zeiger; m_wert = m_klasseb->HoleWert();
};
|
Durch die forwärts deklaration der klasse ist noch lange nicht der inhalt bekannt. Daher kannst du auch erst darauf "zugreifen" sobald die klasse definiert wurde.
(mal ganz salopp ausgedrückt )
Aber Patrick hat wohl recht. Solche Klassenbeziehungen sind oft auf Designfehler zurückzuführen. |
|
Nach oben |
|
|
magynhard Super JLI'ler
Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 11.09.2005, 09:43 Titel: |
|
|
Gebe zu, ist vielleicht etwas unsauber, doch fällt mir da keine andere Lösung ein, bei der die Klasse selbst die Aufgabe übernimmt - ein Anfänger übt sich. Hätte halt vermutl. von Grund auf etwas anders organisiert werden müssen. Werde jedoch in diesem Falle auf dieser Lösung beruhen.
Ich hatte eigentlich gedacht, dass der Kompiler anders arbeitet und sich bei der Vorwärtsdeklaration die Klasse selbst auch schon einverleibt.
Ich danke euch! _________________ Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
|
|
Nach oben |
|
|
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 11.09.2005, 09:47 Titel: |
|
|
magynhard hat Folgendes geschrieben: | Ich hatte eigentlich gedacht, dass der Kompiler anders arbeitet und sich bei der Vorwärtsdeklaration die Klasse selbst auch schon einverleibt. |
in der hinsicht ist der c++ compiler etwas stur ist einer der gründe warum ich in mancher hinsicht lieber java programmiere |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 11.09.2005, 10:35 Titel: |
|
|
Sollte funktionieren wenn du deine Funktionen in der .cpp ausschreibst und nicht in der Klassendefinition selber. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
|