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

17.02.2009, 20:12

Klassen einfache Vererbung Problem

Hallo!

Ich habe ein Problem mit der Vererbung in Klassen. Ich hab mal die Listings mir angeschaut und jetzt ein eigenes geschrieben. Es funkt aber nicht.

Ich verwende Visual Studio 2008 Pro und das gibt es aus:

Zitat


------ Erstellen gestartet: Projekt: Klassen_Vererbung, Konfiguration: Debug Win32 ------
Kompilieren...
Klassen_Vererbung.cpp
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\raumschiff.hpp(1) : error C2011: 'CRaumschiff': 'class' Typneudefinition
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\raumschiff.hpp(1): Siehe Deklaration von 'CRaumschiff'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.hpp(2) : error C2504: 'CRaumschiff': Basisklasse undefiniert
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\klassen_vererbung.cpp(8) : error C2079: 'Raumschiff' verwendet undefiniertes class 'CRaumschiff'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\klassen_vererbung.cpp(12) : error C2228: Links von ".Init" muss sich eine Klasse/Struktur/Union befinden.
Typ ist 'int'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\klassen_vererbung.cpp(13) : error C2228: Links von ".Starten" muss sich eine Klasse/Struktur/Union befinden.
Typ ist 'int'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\klassen_vererbung.cpp(14) : error C2228: Links von ".Landen" muss sich eine Klasse/Struktur/Union befinden.
Typ ist 'int'
Minenleger.cpp
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\raumschiff.hpp(1) : error C2011: 'CRaumschiff': 'class' Typneudefinition
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\raumschiff.hpp(1): Siehe Deklaration von 'CRaumschiff'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.cpp(6) : error C2027: Verwendung des undefinierten Typs "CRaumschiff"
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\raumschiff.hpp(1): Siehe Deklaration von 'CRaumschiff'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.cpp(6) : error C2227: Links von "->{ctor}" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
Typ ist 'int (void)'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.cpp(15) : error C2065: 'm_Mine': nichtdeklarierter Bezeichner
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.cpp(19) : error C2065: 'm_Name': nichtdeklarierter Bezeichner
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.cpp(21) : error C2027: Verwendung des undefinierten Typs "CRaumschiff"
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\raumschiff.hpp(1): Siehe Deklaration von 'CRaumschiff'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.cpp(22) : error C2065: 'm_Name': nichtdeklarierter Bezeichner
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.cpp(24) : error C2027: Verwendung des undefinierten Typs "CRaumschiff"
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\raumschiff.hpp(1): Siehe Deklaration von 'CRaumschiff'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.cpp(26) : error C2065: 'm_Name': nichtdeklarierter Bezeichner
Code wird generiert...
Das Buildprotokoll wurde unter "file://g:\Eigene Datein\Programmieren\Visual Studio 2008\Klassen_Vererbung\Klassen_Vererbung\Debug\BuildLog.htm" gespeichert.
Klassen_Vererbung - 15 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========


Raumschiff.cpp:

Zitat


#include <iostream>
#include "Raumschiff.hpp"
using namespace std;

CRaumschiff::CRaumschiff(){
m_Energie = 1000;
cout << "Konstruktor wurde aufgerufen" << endl;
}
void CRaumschiff::Starten(){
cout << "Raumschiff " << m_Name << " ist gestartet!" << endl;
}
void CRaumschiff::Landen(){
cout << "Raumschiff " << m_Name << " ist gelandet!" << endl;
}
void CRaumschiff::Init(){
cout << "Name des Raumschiffes eingeben! ";
cin.get(m_Name, 29);
}


Raumschiff.hpp:

Zitat


class CRaumschiff{
protected:
//Membervariablen. Wie private, nur dass die anderen Klassen (Vererbung) auch noch Zugriff haben.
int m_Energie;
char m_Name[50];

public:
//Memberfunktionen
//Konstruktoren haben KEINEN Rückgabetyp!
CRaumschiff();
void Starten();
void Landen();
void Init();
};


Minenleger.cpp:

Zitat


#include <iostream>
#include "Minenleger.hpp"
#include "Raumschiff.hpp"
using namespace std;

CMinenleger::CMinenleger(){
m_Minen = 10;
cout << "Konstruktor wurde aufgerufen" << endl;
}
void CMinenleger::Mine_Legen(){
if(m_Minen <= 0){
cout << "Keine Minen mehr übrig." << endl;
}else{
m_Minen--;
cout << "Mine gelegt. Es sind noch " << m_Mine << " Minen übrig." << endl;
}
}
void CMinenleger::Starten(){
cout << "Minenleger " << m_Name << " ist gestartet!" << endl;
}
void CRaumschiff::Landen(){
cout << "Minenleger " << m_Name << " ist gelandet!" << endl;
}
void CRaumschiff::Init(){
cout << "Name des Minenlegers eingeben! ";
cin.get(m_Name, 29);
}


SRY, dass ich den ganzen Code posten musste, aber ich wüsste nicht, wie sonst.

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

2

17.02.2009, 20:15

Aufgrund des Fehlers über die Typneudefinition tippe ich jetzt einfach mal, dass du folgedes vergessen hast: Packe alle Headerdateien in eine solche Struktur:

C-/C++-Quelltext

1
2
3
4
5
6
#ifndef NAME_DER_DATEI_H_
#define NAME_DER_DATEI_H_

// Hier dein Header-Teil


#endif
<< an dieser Stelle ist eine Signatur verstorben >>

3

17.02.2009, 20:25

und was bewirkt die genau und wie wende ich sie an? schon oft gesehen, noch nie gewusst wie das geht.

4

17.02.2009, 20:30

Quellcode

1
#ifndef NAME_DER_DATEI_H_


Wenn "NAME_DER_DATEI_H_" nicht definiert ist wird der darunterstehende Code ausgeführt


Quellcode

1
#define NAME_DER_DATEI_H_

Hier wird dann "NAME_DEr_DATEI_H_ definiert... das wird nur dann ausgeführt wenn es noch nicht geschehen ist. Damit wird sichergestellt dass die Klasse nur einmal definiert wird auch wenn der header doppelt oder dreifach eingebunden wurde. Es wird, falls es schon exestiert, sozusagen einfach übersprungen

Hier kommt dann der Inhalt der Headerdatei rein


Quellcode

1
#endif

Und hier hört das auszuführende der If-Bedinung auf

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

17.02.2009, 20:32

Das ist ein sogenannter Header Guard.

Du darfst Klassendefnitionen (und auch andere Definitionen) nur einmal in eine Übersetzungseinheit definieren, was durch mehrere includes durchaus ein Problem werden kann. Somit hat man Header Guards erfunden, die verhindern, dass eine Definition 2 mal auftritt.

C-/C++-Quelltext

1
2
3
4
5
6
#ifndef NAME_DER_DATEI_H_ //Wenn NAME_DER_DATEI_H nicht definiert ist

#define NAME_DER_DATEI_H_ //definere es


// und hier kommt das ganze hin


#endif //das ende der ersten Zeile


Das heisst soviel, dass, wenn das da schon einmal ausgeführt wurde der Compiler einfach zum #endif springt und das dazwischen nicht miteinbezieht und du hast es garantiert nur einmal drin.

Viele Compiler unterstützen pragma, was du einmal in einer Datei schreiben kannst und dann die gleiche Auswirkung hat. (Der Compiler kann ggf. schnell compilen, als mit dem define).
Dazu müsste sich noch was im Forum finden lassen.

6

17.02.2009, 20:33

sorry für die peinliche frage, aber was schreib ich statt Name der datei H wenn es mehrere sind?

//EDIT:

Jetzt gibt er das aus:

Zitat

------ Erstellen gestartet: Projekt: Klassen_Vererbung, Konfiguration: Debug Win32 ------
Kompilieren...
Klassen_Vererbung.cpp
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\raumschiff.hpp(1) : error C2011: 'CRaumschiff': 'class' Typneudefinition
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\raumschiff.hpp(1): Siehe Deklaration von 'CRaumschiff'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.hpp(2) : error C2504: 'CRaumschiff': Basisklasse undefiniert
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\klassen_vererbung.cpp(8) : error C2079: 'Raumschiff' verwendet undefiniertes class 'CRaumschiff'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\klassen_vererbung.cpp(12) : error C2228: Links von ".Init" muss sich eine Klasse/Struktur/Union befinden.
Typ ist 'int'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\klassen_vererbung.cpp(13) : error C2228: Links von ".Starten" muss sich eine Klasse/Struktur/Union befinden.
Typ ist 'int'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\klassen_vererbung.cpp(14) : error C2228: Links von ".Landen" muss sich eine Klasse/Struktur/Union befinden.
Typ ist 'int'
Minenleger.cpp
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\raumschiff.hpp(1) : error C2011: 'CRaumschiff': 'class' Typneudefinition
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\raumschiff.hpp(1): Siehe Deklaration von 'CRaumschiff'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.cpp(12) : error C2027: Verwendung des undefinierten Typs "CRaumschiff"
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\raumschiff.hpp(1): Siehe Deklaration von 'CRaumschiff'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.cpp(12) : error C2227: Links von "->{ctor}" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
Typ ist 'int (void)'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.cpp(21) : error C2065: 'm_Mine': nichtdeklarierter Bezeichner
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.cpp(25) : error C2065: 'm_Name': nichtdeklarierter Bezeichner
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.cpp(27) : error C2027: Verwendung des undefinierten Typs "CRaumschiff"
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\raumschiff.hpp(1): Siehe Deklaration von 'CRaumschiff'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.cpp(28) : error C2065: 'm_Name': nichtdeklarierter Bezeichner
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.cpp(30) : error C2027: Verwendung des undefinierten Typs "CRaumschiff"
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\raumschiff.hpp(1): Siehe Deklaration von 'CRaumschiff'
g:\eigene datein\programmieren\visual studio 2008\klassen_vererbung\klassen_vererbung\minenleger.cpp(32) : error C2065: 'm_Name': nichtdeklarierter Bezeichner
Raumschiff.cpp
Code wird generiert...
Das Buildprotokoll wurde unter "file://g:\Eigene Datein\Programmieren\Visual Studio 2008\Klassen_Vererbung\Klassen_Vererbung\Debug\BuildLog.htm" gespeichert.
Klassen_Vererbung - 15 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

17.02.2009, 20:35

Zitat von »"RSP-Fan"«

sorry für die peinliche frage, aber was schreib ich statt Name der datei H wenn es mehrere sind?


Irgendwas. Am besten möglichst kompliziert und einmalig. ;)

Also wenn du eine Datei hast, die z.B StateManager.h hast, dann wird üblicherweise irgendwie was, wie STATEMANAGER_H rausokommen. Du kannst dem ganzen auch noch ein Präfix geben oder auch noch ein namespace Name voredran stellen.

8

17.02.2009, 20:36

Wird schwer werden mehrere Datein gleich zu nennen ö.ö

Also nicht H als name benutzen sondern wenn du die datei
Minenleger.hpp
hast

dann benutzt du

MINENLEGER_H_

und wenn dein Header in den du das schreibst
Barbararhabarberbarbarbarenbarbier.hpp heißt
benutzt du
BARBARARHABARBERBARBARBARENBARBIER_H_

9

17.02.2009, 20:40

Danke, aber er will es immernoch nicht. Ich kann leider mit den ausgaben (noch) nichts anfangen, aber das wird schon noch werden...

10

17.02.2009, 20:44

Was heißt denn "er will es immer noch nicht"?
Dieselben Fehler wie vorher?
Zeig mal den aktualisierten Code. (C++ Codetags verwenden)
fka tm

Werbeanzeige