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

1

28.05.2013, 19:50

projects\programm55\programm55\raumschiff.hpp(6): error C2011: 'CRaumschiff': 'class' Typneudefinition

So, nach ewigen hin und her habe ich mich jetzt schlussendlich auch diesem Forum angeschlossen.
Seit mehreren Stunden sitze ich jetzt schon an einem kleine Problem. Im Buch 'C++ für Spieleprogrammierer' wird ein Teil eines Kapitels der einfachen Vererbung gewidmet. Nachdem ich dazu ein kleines Beispiel nach Programmiert habe, wollte ich dieses dannach nochmal in seperaten Dateien schreiben und jetzt weiß ich schon seit ein paar Stunden nicht wo dass Problem liegt (bin noch Anfänger). Durch meine guten Google kenntnisse bin ich jetzt darauf gestoßen, dass der error ("error C2011: 'CRaumschiff': 'class' Typneudefinition") was mit den Headerdateien zu tun haben kann. Aber was?


main.cpp

C-/C++-Quelltext

1
2
3
4
5
6
// Programm 55// [Datei: main.cpp]//#include <iostream>#include "Abfangjaeger.hpp"#include "Minenleger.hpp"
using namespace std;
// Hauptprogramm//int main(){   // Variablen    CMinenleger Miner;      // Minenleger erstellen CAbfangjaeger Jaeger;   // Abfangjaeger erstellen
    // Einige Aktionen mit dem Minenleger ausführen    Miner.Starten();    Miner.Mine_Legen(); Miner.Mine_Legen(); Miner.Landen();
    // Eingie Aktionen mit dem Abfangjaeger ausführen  Jaeger.Starten();   Jaeger.Rakete_Feuern(); Jaeger.Rakete_Feuern(); Jaeger.Landen();
    return 0;} // Hauptprogramm



Raumschiff.hpp

C-/C++-Quelltext

1
2
3
4
5
// Programm55// [Datei: Raumschiff.hpp]//
class CRaumschiff{  protected:
        // Membervariablen      int m_Farbe;        int m_Energie;
    public:
        // Memberfunktionen         CRaumschiff();      void Starten();     void Landen();};



Raumschiff.cpp

C-/C++-Quelltext

1
2
3
4
5
6
// Programm55// [Datei: Raumschiff.cpp]//#include <iostream>#include "Raumschiff.hpp"
using namespace std;
// Konstruktor//// Aufgabe: Membervariablen initialisieren//CRaumschiff::CRaumschiff(){ m_Farbe = 0;    m_Energie = 1000;
    cout << "Es wurde ein Raumschiff erstellt." << endl;} // Konstruktor
// Starten//// Aufgabe: Raumschiff starten lassen//void CRaumschiff::Starten(){ cout << "Raumschiff ist gestartet." << endl;} // Starten
// Landen//// Aufgabe: Raumschiff Landen lassen//void CRaumschiff::Landen(){    cout << "Raumschiff ist gelandet." << endl;} // Landen




Minenleger.hpp

C-/C++-Quelltext

1
2
3
4
5
// Programm55// [Datei: Minenleger.hpp]//#include "Raumschiff.hpp"
class CMinenleger : public CRaumschiff{ private:
        // Membervariablen      int m_Minen;
    public:
        // Memberfunktionen         CMinenleger();      void Mine_Legen();};



Minenleger.cpp

C-/C++-Quelltext

1
2
3
4
5
6
// Programm55// [Datei: Minenleger.cpp]//#include <iostream>#include "Minenleger.hpp"
using namespace std;
// Konstruktor//// Aufgabe: Minenleger initialisieren//CMinenleger::CMinenleger(){  m_Minen = 10;
    cout << "Es wurde ein Minenleger erstellt." << endl;} // Konstruktor
// Mine_Legen//// Aufgabe: Eine Mine legen//void CMinenleger::Mine_Legen(){ m_Minen--;
    cout << "Mine wurde gelegt. Es sind noch " << m_Minen << " Mine/-n uebrig." << endl;} // Mine_Legen



Abfangjaeger.hpp

C-/C++-Quelltext

1
2
3
4
5
// Programm55// [Datei: Abfangjaeger.hpp]//#include "Raumschiff.hpp"
class CAbfangjaeger : public CRaumschiff{   private:
        // Membervariablen      int m_Raketen;
    public:
        // Memberfunktionen         CAbfangjaeger();        void Rakete_Feuern();};



Abfangjaeger.cpp

C-/C++-Quelltext

1
2
3
4
5
6
// Programm55// [datei: Abfangjaeger.cpp]//#include <iostream>#include "Abfangjaeger.hpp"
using namespace std;
// Konstruktor//// Aufgabe: Abfangjaeger initialisieren//CAbfangjaeger::CAbfangjaeger(){    m_Raketen = 10;
    cout << "Es wurde ein Abfangjaeger erstellt." << endl;} // Konstruktor
// Rakete_Feuern//// Aufgabe: Eine Rakete abfeuern//void CAbfangjaeger::Rakete_Feuern(){    m_Raketen--;
    cout << "Rakete wurde abgefeuert. Es sind noch " << m_Raketen << " Rakete/-n uebrig." << endl;} // Rakete_Feuern


Ich würde mich über jeden Verbesserungsvorschlag bzw. jede Hilfe freuen :D

2

28.05.2013, 19:58

Google-Stichwort: Include Guards
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

3

28.05.2013, 20:06

Verbesserungsvorschlag: Wenn du den Beitrag schreibst, wähle bitte den Tab Quellcode aus. Dadurch bleibt die Formatierung des Quelltextes erhalten.

Der Fehler liegt daran, dass eine Datei eine andere einbindet, die wiederum eine Datei einbindet, die schon in der anderen eingebunden wurde.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
// A.hpp
#include "C.hpp"
#include "B.hpp"

class A
{ 
 // ...
}


C-/C++-Quelltext

1
2
3
4
5
6
7
// C.hpp
#include "B.hpp"

class C
{
  // ...
}


Hier benötigen die Klassen A und C die Klasse B, dadurch wird sie zweimal eingebunden und dadurch neu definiert, was zu einem Fehler führt, da es die Klasse beim zweiten Einbinden schon gibt.

Um das zu verhindern gibt es, wie Steef schon gesagt hat, Include Guards.

4

28.05.2013, 20:47

Danke, dann werde ich dass nachher nochmal durchgehen :D

Werbeanzeige