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

Anonymous

unregistriert

1

12.05.2004, 20:22

Frage zur TriBase Engine - Verwendete Symbole vordeklarieren

Hallo,

ich habe nur eine kurze Frage zur TriBase Engine. In vielen der Header Dateien steht am Anfang "// Verwendete Symbole vordeklarieren" gefolgt von z.B. "class tbVector2;" oder "class tbMatrix;".

Nun die triviale Frage (aber für mich leider nicht triviale Antwort): Wieso ist das so?

Kann es sein, dass es Probleme gibt, wenn man so viele Header Dateien hat, und sie irgendwie alle miteinander verlinkt sind? Durch dieses Vor-Deklarieren könnte man diese Probleme ja vielleicht umgehen, so mein Gedankengang.

Vielen Dank für die "Aufklärung" :)

2

12.05.2004, 20:30

Probleme gibt es mit vielen Header Files nicht. Es wird aber unübersichtlich, weil man nachher nicht mehr weis was wo schon eingefügt wurde.

Diese Vordeklaration diehnt einfach nur dafür dies zu umgehen und dafür zu sorgen das der Compiler weis das es eine solche Klasse/Struktur mit diesem Namen gibt.
Dies ist jedoch nur möglich wenn der Compiler nicht die Größe der Klasse/Struktur brauch. Z.B: beim verwenden von Zeigern und Referenzen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

3

13.05.2004, 00:12

Hm, bei mir gibt es z.Z. leider doch irgendwie Probleme, was wohl an mir liegt.

Ich bin z.B. in einer Header Datei A eine andere B ein (alles selbstgeschriebene), um dann in A ein Symbol (z.B. eine Klasse) aus B zu verwenden. Trotzdem sagt mir der Compiler, dass er das Symbol (in A, aus B) nicht kennt.
Das kann nur einen Grund haben, der Header wurde zwar eingebunden, aber nicht nochmals vom Compiler beachtet. Ich habe in den Header Dateien das typische (IFNDEF x DEF x ENDIF) drin, um mehrfachcompilierung zu verhindern.

Leider gerät gerade alles aus dem Lot, ich kann auch irgendwie nicht mehr zurückverfolgen, was nun von wem eingebunden ist, ziemliches Chaos.

Ich frage mich eben nur, warum er die Klasse trotz Einbinden des entsprechenden Headers nicht finden kann.

Wie wird denn im allg. vorgegangen, gibt es eine Header Datei, die alle anderen einbindet, oder sollten andere Header Dateien immer nur die includen, die sie auch wirklich brauchen etc... Gibt es nicht auch Probleme, wenn 2 Klassen sich quasi gegenseitig brauchen? Dann bindet der Header von Klasse A den von B ein - wenn der kompiliert wird, wird er es ja nur einmal. Dann bindet B aber noch den Header von A ein, der wurde aber schon kompiliert und durch #define wird er ein 2. mal nicht mehr beachtet...

Ich hoffe jemand kann Ordnung in dieses Gedankenchaos von mir bringen :)

4

13.05.2004, 02:02

Zitat

Wie wird denn im allg. vorgegangen, gibt es eine Header Datei, die alle anderen einbindet, oder sollten andere Header Dateien immer nur die includen, die sie auch wirklich brauchen

Das Problem kenne ich auch. Deshalb mach ich es immer so das eine Header nur die Header einbindet die auch zwingend gebraucht werden. Damit sinken die Einbindungen drastisch. Aber eine Allgemeine Regel gibt es meines Wissens nach nicht.

Zitat

Ich bin z.B. in einer Header Datei A eine andere B ein (alles selbstgeschriebene), um dann in A ein Symbol (z.B. eine Klasse) aus B zu verwenden. Trotzdem sagt mir der Compiler, dass er das Symbol (in A, aus B) nicht kennt.
Ich denke das dieses Problem daher rührt das deine Header A die Header B einbindet und Header B aber auch Header A einbindet. Kann natürlich auch ein anderer Fehler sein. Wie z.B. eine Fehlende Klammer oder ein vergessenes Semikolon.

Zitat

Gibt es nicht auch Probleme, wenn 2 Klassen sich quasi gegenseitig brauchen?
Dafür kann man ja eine Klasse/Struktur bekannt machen. Die eine Klasse/Strktur muss dann nur einen Zeiger oder Referenz benutzen, sonst will der Compiler die Größe der Klasse haben. Z.B. so

Quellcode

1
2
3
4
5
6
7
8
9
10
11
struct A;
struct B
{
  int i;
  A* pa;
};

struct A
{
  B b;
};

In einem Aktuellen Projekt Arbeite ich nur mit Interfaces und viele Interfaces brauchen viele Interfaces. Da aber nur Pointer verwendet werden, brauch ich nicht alle Header einbinden und kann es bei der Bekanntmachung belassen. Das steigert mächtig die Übersicht und erst bei den einzelnen Modulen werden die Header eingebunden.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

5

13.05.2004, 16:32

Gut danke erstmal. Ich denke ich muss mein ganzes Projekt nun erstmal ein wenig aufräumen / umräumen. Ich möchte ja, dass ein Entwickler, der meine Engine benutzen möchte, nur eine Header Datei einbinden muss. In dieser zentralen Header Datei wird dann auch alles andere eingebunden.

Ich denke ich werden dann mit den anderen Header Dateien so vorgehen, dass ich 1.) nur die benötigten Header inkludiere, und 2.) oft dieses "Vordeklarieren" verwende, um solchen Inlcude Problemen aus dem Weg zu gehen.

Falls jemand Einwände dagegen hat, weil dies ein schlechter Programmierstil ist, dann bitte sofort melden :) :)

6

13.05.2004, 18:22

Zitat

Probleme gibt es mit vielen Header Files nicht. Es wird aber unübersichtlich, weil man nachher nicht mehr weis was wo schon eingefügt wurde.


Doch gibt es, VertexBufferManager included VertexBuffer, Vertexbuffer included VertexBufferManager weil jede Klasse ein pointer der anderen braucht. Ohne vordeklaration wäre so etwas nicht möglich und man müsste es in 1 header packen.

7

13.05.2004, 22:49

Zitat

Doch gibt es, VertexBufferManager included VertexBuffer, Vertexbuffer included VertexBufferManager weil jede Klasse ein pointer der anderen braucht. Ohne vordeklaration wäre so etwas nicht möglich und man müsste es in 1 header packen.
Nein gibt es nicht. Denn weder der Manager includiert den VB noch der VB Inkludiert den Manager ;)

Da beide mit Pointern Arbeiten reicht eine bekantmachung.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige