JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=afbc2fe4d2d6f8c12759c174877840f8Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Frage zu #include

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
mundschmiss
Mini JLI'ler



Anmeldedatum: 09.10.2003
Beiträge: 10

Medaillen: Keine

BeitragVerfasst am: 12.10.2003, 23:02    Titel: Frage zu #include Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 12.10.2003, 23:19    Titel: Antworten mit Zitat

Wenn du Java kennst, kennst du bestimmt auch OOP. Dann solltest du es mit der Vererbungstechnik probieren.
_________________
Kein Rückzug! Kein Aufgeben!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 13.10.2003, 07:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
mundschmiss
Mini JLI'ler



Anmeldedatum: 09.10.2003
Beiträge: 10

Medaillen: Keine

BeitragVerfasst am: 13.10.2003, 12:56    Titel: Antworten mit Zitat

Klasse!

Das macht das Ganze einfacher.

Danke!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
mundschmiss
Mini JLI'ler



Anmeldedatum: 09.10.2003
Beiträge: 10

Medaillen: Keine

BeitragVerfasst am: 13.10.2003, 15:43    Titel: Antworten mit Zitat

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 Question) .


Danke schon mal!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 13.10.2003, 16:03    Titel: Antworten mit Zitat

[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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 13.10.2003, 16:33    Titel: Antworten mit Zitat

Die Methode

Code:

MethodeDieAufAZugreift()
{
    m_pA->IrgendWas();
}


muss dann im .cpp File nicht im Header stehen.

C.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
mundschmiss
Mini JLI'ler



Anmeldedatum: 09.10.2003
Beiträge: 10

Medaillen: Keine

BeitragVerfasst am: 13.10.2003, 17:25    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 13.10.2003, 17:45    Titel: Antworten mit Zitat

du musst in b.cpp noch a.h includieren.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
mundschmiss
Mini JLI'ler



Anmeldedatum: 09.10.2003
Beiträge: 10

Medaillen: Keine

BeitragVerfasst am: 13.10.2003, 17:56    Titel: Antworten mit Zitat

Juchu!
Very Happy
Danke!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 26.10.2003, 15:31    Titel: Neue Frage zu #include Antworten mit Zitat

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. Crying or Very sad

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..... Mad
Das schlimme dabei ist, dass die Fehler in den DX Header Dateien auftreten!
Beispielsweise:
Code:
c:\Programme\...\PlatformSDK\Include\d3dx8math.h
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum