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

Gon

Treue Seele

  • »Gon« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

1

03.11.2009, 23:07

Problem bei gegenseitiger Einbindung von Headern

Hi,

ich hab ein kleines Problem: ich binde zwei Header gegenseitig ein (einmal der zentrale Spiel-Header und einmal der Menü-Header), da in der einen Datei jeweils auf Code der anderen Datei zugegriffen werden können muss.

Wenn ich im Spiel-Header nun einen Zeiger auf eine Instanz des Menüs deklarieren will, meckert der Compiler:

Quellcode

1
2
3
4
1>Menu.cpp
1>c:\users\erik\programmierung\projekte\c++\grafik-programme\slugger\slugger.h(34) : error C2143: Syntaxfehler: Es fehlt ';' vor '*'
1>c:\users\erik\programmierung\projekte\c++\grafik-programme\slugger\slugger.h(34) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\users\erik\programmierung\projekte\c++\grafik-programme\slugger\slugger.h(34) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.


und zwar bei folgendem Code:

C-/C++-Quelltext

1
2
#include "Menu.h"
CMenu       *m_pMenu;


Wie kann man dieses Problem umgehen?

Vielen Dank im Voraus,

MfG Gon

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

03.11.2009, 23:09

In dem du bei der Klassendefinition am Ende der Klasse das Semikolon machst..

C-/C++-Quelltext

1
2
3
4
class CMenu   
{
...
}; // <------

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

03.11.2009, 23:21

wenn du eine header datei einbindest nimmst du alle includes des headers mit. du darfst sie nicht gegenseitig einbinden weil du sonst ne endlosschleife baust. das problem hatte ich auch mal.

schreib ein prototyp der klasse die du einbinden willst und includiere in der cpp datei.

ich weiss ja nicht was du für ein menü schreibst aber meins nutzt rückgabewerte und das reicht völlig aus oO
vllt solltest du dir überlegen ob du das nicht anders umsetzen kannst?

4

03.11.2009, 23:42

Und wenn du schon auf dein Menü einen Zeiger hast bieten sich Vorwärtsdeklarationen doch geradezu an. Den entsprechenden Header musst du dann nur mehr in der source-Datei einbinden:

C-/C++-Quelltext

1
2
3
// Header

class CMenu;
CMenu *m_pMenu;


C-/C++-Quelltext

1
2
3
4
// Source

#include "Menu.h"

m_pMenu->load();
Tutorials zu OpenGL, Ubuntu und Programmieren allgemein: www.tomprogs.at

Forum und Wiki zum Programmieren lernen: proggen.org/forum.proggen.org

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

03.11.2009, 23:55

Auch wenn ich mal bezweifle, dass es hier um zyklische Abhängigkeiten geht, ist es schon auch zu empfehlen, wenn möglich eine Vorwärtsdeklaration zu nehmen. Wann/Warum das geht und wann nicht, kannst du auf meinem Blog nachlesen:

http://drakon.ch/?id=1200&mobile=0

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

6

05.11.2009, 22:41

Stichwörter:
:arrow: Includeguards, #pragma once
:arrow: "Klassenprototypen": class CMenu; CMenu *pMenu; (Unbedingt auf richtige namespaces achten, da er sonst später durcheinander kommt)
:arrow: Methodenrumpf in cpp Datei auslagern, damit der Compiler weniger zu tun hat und du in den Headern die wenigsten Includes hast
:arrow: Vermeiden eines "all-in-one-Headers". Das ist zwar bequem, steigert aber die Compiletime enorm, was dir später derartig auf den Sack geht, dass du dir wünschst, du hättest damit nie angenfangen. Glaube mir.

Socke

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

05.11.2009, 22:51

Zitat von »"Faule Socke"«


:arrow: Vermeiden eines "all-in-one-Headers". Das ist zwar bequem, steigert aber die Compiletime enorm, was dir später derartig auf den Sack geht, dass du dir wünschst, du hättest damit nie angenfangen. Glaube mir.

Socke


Mit Vorkompilierten Headern ist das aber eine sehr gute Sache.

8

05.11.2009, 23:11

Zitat von »"drakon"«

Mit Vorkompilierten Headern ist das aber eine sehr gute Sache.
Das betrifft aber nur verhältnismässig wenige Standard- und Bibliotheksheader, die man sehr oft braucht. Ich glaube, Faule Socke meint allgemein Massen-Inkludierungs-Header, die einem vor sauber strukturiertem Code bewahren. Also die Abhängigkeitshölle persönlich. :badgrin:

Gon

Treue Seele

  • »Gon« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

9

08.11.2009, 16:26

Ok, vielen Dank, hat geklappt ;)

Edit:

Zitat von »"Faule Socke"«

Stichwörter:
:arrow: Includeguards, #pragma once
:arrow: "Klassenprototypen": class CMenu; CMenu *pMenu; (Unbedingt auf richtige namespaces achten, da er sonst später durcheinander kommt)
:arrow: Methodenrumpf in cpp Datei auslagern, damit der Compiler weniger zu tun hat und du in den Headern die wenigsten Includes hast
:arrow: Vermeiden eines "all-in-one-Headers". Das ist zwar bequem, steigert aber die Compiletime enorm, was dir später derartig auf den Sack geht, dass du dir wünschst, du hättest damit nie angenfangen. Glaube mir.

Socke


#pragma once und #ifndef ist doch dasselbe, oder?
Und das mit den namespacen lohnt sich doch nur bei größeren Projekten, bei kleineren reicht doch der globale namespace, oder sollte man sich trotzdem (einen) eigene(n) anlegen?
All-in-one Header verwende ich sowieso nicht. Hab ich mal versucht, doch dann kamen zig Meldungen, hab es dann wieder normal gemacht

MfG Gon ;)

Werbeanzeige