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

derolli

Treue Seele

  • »derolli« ist der Autor dieses Themas

Beiträge: 144

Beruf: Student

  • Private Nachricht senden

1

20.08.2011, 20:20

Problem mit Klasseninstanze

Hallo Leute,

Ich habe ein Problem in meinem aktuellem Projekt.
Ich möchte eine Instanze einer Klasse als Membervariable einer anderen
Klasse erstellen, doch der Compiler gibt diesen Fehler aus:

C-/C++-Quelltext

1
2
3
1>c:\users\oliver\documents\visual studio 2010\projects\rpg\rpg\world.h(32): error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'm_Mob'
1>c:\users\oliver\documents\visual studio 2010\projects\rpg\rpg\world.h(32): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\users\oliver\documents\visual studio 2010\projects\rpg\rpg\world.h(32): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.


Hier der Inhalt der beiden Dateien in denen das Problem auftritt:
World.h:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#pragma once

#include "Game.h"
#include "Player.h"
#include "Mob.h"

struct SObject
{
    sf::Sprite  Sprite;
    float       PosX;
    float       PosY;
};


class CWorld
{
public:
    CWorld();
    ~CWorld(void);
    void Render (sf::RenderWindow *Window);
    void Move ();
    void Update (std::string WorldName);
    bool PlayerWorldCollision (float PosX, float PosY);

private:
    std::string WorldFile;
    std::string Directory;

    SObject     m_Tree [50];
    sf::Image   m_ITree;

    CMob        m_Mob;
    sf::Image   m_IMob;
    char        m_cMobImageFile [256];

    sf::Music   BackgroundMusic;
    char        m_cMusicFile [256];

    
    
};


Mob.h:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#pragma once

#include "Game.h"

class CMob
{
public:
    CMob(void);
    ~CMob(void);
    void Init (sf::Image Image, int Type, int Level, float PosX, float PosY);
    void Move () {}
    void Render (sf::RenderWindow *Window);

private:
    sf::Sprite  m_SMob;
    float       m_PosX;
    float       m_PosY;
    int         m_Level;
    int         m_Type;
    int         m_Energy;
    int         m_MaxEnergy;
    bool        m_IsAttacking;
    bool        m_Attacked;

};


Ich finde einfach den Fehler nicht. Ich habe doch Mob.h in World.h includiert, was mache ich falsch?

Gruß derolli

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

2

20.08.2011, 20:24

Ich wette Game.h bindet World.h ein :D
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

derolli

Treue Seele

  • »derolli« ist der Autor dieses Themas

Beiträge: 144

Beruf: Student

  • Private Nachricht senden

3

20.08.2011, 20:26

Ja, na und?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

4

20.08.2011, 20:31

Gane.h bindet World.h ein, World.h bindet Mob.h ein, Mob.h wieder Game.h, Game.h wieder World.h usw.
Das geht so natürlich nicht, weil das nie enden würde.
CMob muss Game.h doch garnicht kennen. ;)
Sei sparsam mit includes in Headern.

Übrigens übergibst du sf::Image im Konstruktor als Wert. ^^
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

derolli

Treue Seele

  • »derolli« ist der Autor dieses Themas

Beiträge: 144

Beruf: Student

  • Private Nachricht senden

5

20.08.2011, 20:49

Dann muss ich aber in jede Datei die gesammte SFML immer wieder neu einbinden. Ist das nicht viel fehleranfälliger?

Powerpaule

Treue Seele

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

6

20.08.2011, 20:59

Am besten ist es, in den .cpp-Dateien immer nur das zu includen, was dort auch wirklich gebraucht wird. (Auch aus Compilier-Zeitgründen).
Muss man für die SFML mehrere Sachen includen? Wenn das dann zu aufwendig ist, oder eh immer fast die gleichen Sachen gebraucht werden, dann mach eine Header-Datei, in der alles includet wird was du immer brauchst, und includest diese dann in den ganzen cpp-Dateien, so kannst du trotzdem noch zentral Sachen anpassen.
Includes in Header-Dateien wenn möglich vermeiden. Das geht zum Teil auch gut mit Vorwärtsdeklarationen oder dem dynamischen Erzeugen von Objekten. Geht aber natürlich nicht immer.

Rushh0ur

Frischling

Beiträge: 67

Beruf: Student Elektrotechnik

  • Private Nachricht senden

7

21.08.2011, 05:31

Gane.h bindet World.h ein, World.h bindet Mob.h ein, Mob.h wieder Game.h, Game.h wieder World.h usw.
Das geht so natürlich nicht, weil das nie enden würde.
CMob muss Game.h doch garnicht kennen. ;)


Dieses Verhalten sollte doch der Ausdruck "#pragma once" unterdrücken bzw. vermeiden, oder?

@Topic:
Den Fehler hat ich auch schon oft und den sieht man auf den ersten Blick einfach nicht: Es Fehlt irgentwo ein Semicolon.

Bei dir wahrscheinlich an dieser Stelle (Funktionsdekleration so beabsichtigt?):

Quellcode

1
2
3
class CMob
...
void Move () {};


Mfg Rushh0ur

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

21.08.2011, 09:29

Gane.h bindet World.h ein, World.h bindet Mob.h ein, Mob.h wieder Game.h, Game.h wieder World.h usw.
Das geht so natürlich nicht, weil das nie enden würde.
CMob muss Game.h doch garnicht kennen. ;)


Dieses Verhalten sollte doch der Ausdruck "#pragma once" unterdrücken bzw. vermeiden, oder?

Ja, und genau das ist der Grund für den Fehler. Denn #pragma once tut genau wofür es gedacht ist: Es bricht den Zyklus. Das führt nun aber dazu, dass CMob an der entsprechenden Stelle nicht definiert ist. #pragma once bzw. Includeguards dienen dazu, Mehrfachdefinitionen als Folge vom mehrfachen inkludieren der selben Datei zu verhindern. Es ist kein Freibrief dafür, einfach ohne nachzudenken überall alles zu inkludieren...

@Topic:
Den Fehler hat ich auch schon oft und den sieht man auf den ersten Blick einfach nicht: Es Fehlt irgentwo ein Semicolon.

Bei dir wahrscheinlich an dieser Stelle (Funktionsdekleration so beabsichtigt?):

Quellcode

1
2
3
class CMob
...
void Move () {};

Das ; ist an dieser Stelle nicht notwendig. Der Fehler hier ist ganz klar das zyklische #include, das sieht man daran:

Quellcode

1
Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.

Der Compiler sagt, dass er den angegebenen Typ, also CMob, nicht kennt.

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »dot« (21.08.2011, 09:42)


derolli

Treue Seele

  • »derolli« ist der Autor dieses Themas

Beiträge: 144

Beruf: Student

  • Private Nachricht senden

9

03.09.2011, 15:12

So, wieder da! War 2 Wochen im Urlaub :)
Hab den Fehler behoben, danke!

Werbeanzeige