Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
mundschmiss Mini JLI'ler
Anmeldedatum: 09.10.2003 Beiträge: 10
Medaillen: Keine
|
Verfasst am: 12.10.2003, 23:02 Titel: Frage zu #include |
|
|
Hallo!
Problem:
Ich habe eine Klasse A und eine Klasse B.
Wenn ich Instanzen der Klasse B in der Klasse A verwenden will, so muss ich den Header von B mittels "#include "B.h" " einbinden.
So weit so gut. Jetzt möchte ich aber zusätzlich auch Instanzen von A in der Klasse B verwenden. Wie geht das? Wenn ich in der Klasse B den Header von A einbinde "#include "A.h" ", kommt er in eine Schleife und wird mit dem Einbinden nicht mehr fertig. Oder es kommt eine "Neudefinition"-Fehlermehlung beim kompilieren.
Kann mir jmd helfen?
PS
Ich finde das mit dem Einbinden echt umständlich gelöst in C++.
Man muss sich gut überlegen, welche Header man wo einbindet.
Und wenn man eine neue Klasse implementiert, kann es vorkommen, dass man alles noch mal überdenken muss...
OK, vielleicht ist auch mein Programmierstil schuld, aber in Java war das kein Problem... |
|
Nach oben |
|
|
LeeDiGer Super JLI'ler
Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 12.10.2003, 23:19 Titel: |
|
|
Wenn du Java kennst, kennst du bestimmt auch OOP. Dann solltest du es mit der Vererbungstechnik probieren. _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 13.10.2003, 07:40 Titel: |
|
|
Es gibt mehrere Möglichkeiten:
1. mit #pragma once im Header sorgst du dafür, dass der Header nur einmal eingebudnen wird.
2. Wenn du in der 2. Klasse nur einen Zeiger auf den ersten benötigst, kannst du folgendes machen:
Code: |
// kein #include "b.h"
class b;
class a
{
b* B;
};
|
Christian |
|
Nach oben |
|
|
mundschmiss Mini JLI'ler
Anmeldedatum: 09.10.2003 Beiträge: 10
Medaillen: Keine
|
Verfasst am: 13.10.2003, 12:56 Titel: |
|
|
Klasse!
Das macht das Ganze einfacher.
Danke! |
|
Nach oben |
|
|
mundschmiss Mini JLI'ler
Anmeldedatum: 09.10.2003 Beiträge: 10
Medaillen: Keine
|
Verfasst am: 13.10.2003, 15:43 Titel: |
|
|
Naja, ganz zufrieden bin ich noch nicht.
Zitat: |
2. Wenn du in der 2. Klasse nur einen Zeiger auf den ersten benötigst, kannst du folgendes machen:
Code:
// kein #include "b.h"
class b;
class a
{
b* B;
};
|
Die zweite Lösung ist zwar schön und gut, aber was kann ich überhaupt mit dem Pointer anfangen? Da er ja von einer "leeren" Klasse B ausgeht, kann ich weder auf Funktionen noch Attribute der Instanz der Klasse B zugreifen, auf die der Zeiger zeigt, oder?
Das Problem ist so:
Ich habe eine Instanz der Klasse A und eine Instanz der Klasse B.
Beide sollen gegenseitig auf Attribute und Funktionen zugreifen können.
Ich könnte zwar alle benötigten Attribute z.B. im Konstruktor der jeweils anderen Klasse übergeben; nur ist das sehr umständlich, wenn es sich um sehr viele Attribute handelt. Ausserdem ist es so nicht möglich auf Funktionen der Gegenklasse zuzugreifen (Oder gibt es etwa Zeiger auf Funktionen ) .
Danke schon mal! |
|
Nach oben |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 13.10.2003, 16:03 Titel: |
|
|
[pseudocode]
Code: |
class A;
class B
{
A *m_pA;
MethodeDieAufAZugreift()
{
m_pA->IrgendWas();
}
}
class A
{
B *m_pB;
IrgendWas()
{
}
}
void main()
{
A dasA;
B dasB;
A.m_pB = &dasB;
B.m_pA = &dasA;
}
|
[pseudocode]
Ansonsten könntest du (wenn es nicht nur 2 instanzen von A und B gibt)anstatt eines Zeigers auf A bzw B einfach einen Zeiger auf eine liste von instanzen von A bzw B übergeben.
Bei den Methoden musst du aufpassen, dass es zu keiner endlosrekursion kommt d.h. dass sich die Methoden nicht immer weiter gegenseitig aufrufen. |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 13.10.2003, 16:33 Titel: |
|
|
Die Methode
Code: |
MethodeDieAufAZugreift()
{
m_pA->IrgendWas();
}
|
muss dann im .cpp File nicht im Header stehen.
C. |
|
Nach oben |
|
|
mundschmiss Mini JLI'ler
Anmeldedatum: 09.10.2003 Beiträge: 10
Medaillen: Keine
|
Verfasst am: 13.10.2003, 17:25 Titel: |
|
|
Ok. Jetzt mal langsam.
in der Datei A.h steht:
Code: |
#include "B.h"
class A
{
public:
B *m_pB;
void IrgendWas();
};
|
in A.cpp steht u.a.:
Code: |
void A::IrgendWas()
{
//Impl.
}
|
In B.h steht:
Code: |
class A;
class B
{
public:
A *m_pA;
void MethodeDieAufAZugreift();
|
Und in B.cpp steht:
Code: |
void B::MethodeDieAufAZugreift()
{
m_pA->IrgendWas();
}
|
Es kommt folgende Fehlermeldung:
b.cpp(23) : error C2027: Verwendung des undefinierten Typs "A"
b.h(12) : Siehe Deklaration von 'A'
b.cpp(23) : error C2227: Der linke Teil von '->IrgendWas' muss auf Klasse/Struktur/Union zeigen
Ist meiner Meinung ja auch klar, denn der Compiler geht von der undefinierten Klasse A aus, die nichts mit der in der in A.h deklarierten Klasse zu tun hat.
Aber ihr meint das ja bestimmt anders. Wie? |
|
Nach oben |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 13.10.2003, 17:45 Titel: |
|
|
du musst in b.cpp noch a.h includieren. |
|
Nach oben |
|
|
mundschmiss Mini JLI'ler
Anmeldedatum: 09.10.2003 Beiträge: 10
Medaillen: Keine
|
Verfasst am: 13.10.2003, 17:56 Titel: |
|
|
Juchu!
Danke! |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 26.10.2003, 15:31 Titel: Neue Frage zu #include |
|
|
Ich bin etwas verwirrt.
Ich habe ein Projekt (heruntergeladen) und wenn ich versuche es zu kompilieren kommt (unter anderem) folgender Fehler:
fatal error C1083: Include-Datei kann nicht geöffnet werden: 'MemoryManager.h': No such file or directory
Die Header-Datei ist sogar in der Projektmappe enthalten!
Warum meint der Compiler also nun, dass er diese Datei nicht finden kann?
Daraufhin habe ich mir die entsprechende Datei angeguckt, in der MemoryManager.h inkludiert werden soll.
Dort steht: Code: | #include <MemoryManager.h> |
Da sie sich nicht im selben Verzeichniss befindet habe ich sogar unter "Extras>Optionen" ein zusätzliches Include-Verzeichniss angegeben.
Ich hoffe jemand kann mir helfen...
Danke im Vorraus
p.s. Ich habe auch versucht MemoryManager.h so zu inkludieren: Code: | #include "MemoryManager.h" | Leider ohne Erfolg
[EDIT]
Es wird immer schlimmer.
Jetzt meckert er nicht mehr über fehlende Include Dateien...
Ich musste zusätzliche Include-Verzeichnisse festlegen!
Mein Fehler lag offensichtlich daran, dass der Include-Pfad zu ungenau war.
Aus "C:\Spezial-Include-Dateien" wurde "C:\Spezial-Include-Dateien\Unterordner".
Aber jetzt kommen aufeinmal hundert andere Fehler.....
Das schlimme dabei ist, dass die Fehler in den DX Header Dateien auftreten!
Beispielsweise: Code: | c:\Programme\...\PlatformSDK\Include\d3dx8math.h |
|
|
Nach oben |
|
|
|