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

29.08.2008, 22:43

Problem mit separaten Dateien (hpp, cpp)

Hallo zusammen,
ich beschäftige mich erst seit einigen Wochen mit C++ bzw. dem Programmieren an sich. Hab Kalistas Buch bis einschließlich dem Kapitel über Klassen bearbeitet und jetzt scheitere ich kläglich...
Mein Problem ist, dass ich (laut Compiler) nicht kapiert habe, was ich wo einbinde.
Am Beispiel: Ich erstelle eine Klasse in einer separaten .hpp-Datei, inklusive Deklaration von Membervariablen und -funktionen. Die Definition der Memberfunktionen nehme ich in einer separaten .cpp-Datei vor. In diese .cpp-Datei binde ich mittels #include den header ein, genauso verfahre ich in der main-Datei. So weit, so gut.
Jetzt möchte ich eine Klasse erstellen, die diese Variablen und Funktionen erbt. Diese Klasse erstelle ich in einer neuen .hpp-Datei und es erscheint die Fehlermeldung: error C2504: Basisklasse undefiniert.
Also binde ich Versuchsweise den header der Basisklasse in den header der abgeleiteten Klasse ein. Dann heißt es: error C2011: 'class'-Typ-Neudefinition.
Bin für jede Hilfe dankbar!
PS. Ist das kompletter Unsinn? Erstelle ich die abgeleiteten Klassen einfach im header der Basisklasse?

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

2

30.08.2008, 08:19

ClassA.h

C-/C++-Quelltext

1
2
3
4
5
6
7
#ifndef CLASSA_H
#define CLASSA_H
class A 
{
    virtual int methodA();
};
#endif

ClassA.cpp

C-/C++-Quelltext

1
2
3
4
5
#include "ClassA.h"
int ClassA::methodA()
{
     return (42);
}


ClassB.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
#ifndef CLASSB_H
#define CLASSB_H
#include "ClassA.h"

ClassB : public ClassA
{ 
    virtual int methodA();
    int methodB(); 
};
#endif

ClassB.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
#include "ClassB.h"
int ClassB ::methodA()
{
     return (42 + 1);
}

int ClassB ::methodB()
{
     return (44);
}


Ist hier im Forum entstanden, sollte so aber gehen.

3

30.08.2008, 10:55

Hey!

Also den Fehler mit der Typneudefinition kannst du glaube ich beheben, indem du folgendes bei deiner Basisklasse (die ich mal BLUB nenne) hinzufügst:

#ifndef BLUB
#define BLUB

class Blub...

#endif

So wie bei der Definition der Klasse TSingleton im Buch, bei meiner Auflage auf S.244.

Allerdings keine Garantie, ich beschäftige mich auch noch nicht so lange mit c++ ;)

4

30.08.2008, 11:06

Also das Beispiel von Das Gurke sieht ungf. so aus, wie ich es auch machen würde.

C-/C++-Quelltext

1
class A { virtual int methodA(); }

Hier fehlt aber der Strichpunkt!

C-/C++-Quelltext

1
class A { virtual int methodA(); };

So...
Bei class B fehlt er auch.

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

6

31.08.2008, 13:13

Vielen, vielen Dank Leute!
Mit #ifndef, #define und #endif hab ich es jetzt hinbekommen, nur leider verstehe ich noch nicht ganz, was ich da getan habe...
"Prüfe" ich sozusagen, ob eine header-Info irgendwo gedoppelt auftaucht? Und wenn ja, wieso funktioniert das? Ich definiere doch eigentlich "nur" eine Konstante, die ähnlich heißt wie die Basisklasse. Woher weiß nun der Compiler, was er tun soll?
@Inspire: Hab die Stelle im Werk gefunden! Doch leider schreibt Kalista auch nur (sinngemäß): wird so gemacht, um Mehrfachdeklarationen vorzubeugen...

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

31.08.2008, 14:15

Zitat von »"RookieC++"«

Vielen, vielen Dank Leute!
Mit #ifndef, #define und #endif hab ich es jetzt hinbekommen, nur leider verstehe ich noch nicht ganz, was ich da getan habe...
"Prüfe" ich sozusagen, ob eine header-Info irgendwo gedoppelt auftaucht? Und wenn ja, wieso funktioniert das? Ich definiere doch eigentlich "nur" eine Konstante, die ähnlich heißt wie die Basisklasse. Woher weiß nun der Compiler, was er tun soll?
@Inspire: Hab die Stelle im Werk gefunden! Doch leider schreibt Kalista auch nur (sinngemäß): wird so gemacht, um Mehrfachdeklarationen vorzubeugen...


Den Compiler interessiert das ganze gar nicht. Das findet alles im Präprozessor statt. Der prüft diese # - Sachen. Und löst auch die Makros auf, die man definiert. Du sagst dem Präprozessor eigentlich nur, dass er diese Datei schon einmal geöffnet hatte und er den Code übersprigen soll, da sonst Mehrfachdeklarationen auftauchen.
Der Compiler bekommt dann das zu sehen, was den Präprozessor verlässt.
Unter danderem lässt sich mit dem Präprozessor Metaprogrammierung durchführen, ähnlich wie mit Templates.

8

01.09.2008, 17:37

Erneut vielen Dank!

Werbeanzeige