Frage zum richtigen Einsatz von Headerdateien und gelinkten Binaries

Decelion

Grünschnabel
Hi nochmal,
ich wollte bei diesem Projekt damit beginnen, den Quellcode in verschiedene Dateien + Headerdateien auszulagern und stehe vor der Fehlermeldung:
Code:
g++ -c -o main.o main.cpp -I`sdl-config --cflags`
main.cpp: In function ‘int main()’:
main.cpp:14:26: error: invalid use of incomplete type ‘struct TileType’
maps.h:3:7: error: forward declaration of ‘struct TileType’
make: *** [main] Error 1

Die gefragte main.cpp sieht so aus:
C++:
#include <iostream>
#include "maps.h"
#include <list>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>

using namespace std;

Lists* lists;

int main()
{
    TileType *testTileType;
    testTileType = new TileType();
    cout << "Hello world!" << endl;
    return 0;
}

Die hier oben eingebundene maps.h hat die folgende Form:

C++:
class Object;
class ObjectType;
class TileType;
class Lists;
class Room;
class Level;
class Tile;
class Info;
class Wall;
class Floor;

Und die dazugehörige maps.cpp folgende:
C++:
#include "maps.h"
#include <list>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>

class Object
{
    public:
        ObjectType* objectType;
        Info* info;
};

class ObjectType
{
    int id;
};

class TileType
{
    int id;
};

class Lists
{
    std::list<Object*> objects;
    std::list<ObjectType*> objectTypes;
    std::list<TileType*> tileTypes;
    std::list<Room*> rooms;
};

class Room
{
    Tile **tile;
};

class Level
{
    Room firstroom;
    int firstX;
    int firstY;
};

class Tile
{
    Object* object;
    ObjectType* objectType;
    TileType* tileType;
};

class Info
{
    public:
        int x;
        int y;
};

class Floor : public Info
{

};

class Wall : public Info
{

};


Zu guter letzt die makefile:
Code:
game: all

main: main.cpp
        g++ -c -o main.o main.cpp -I`sdl-config --cflags`
maps: maps.cpp
        g++ -c -o maps.o maps.cpp -I`sdl-config --cflags`

all: main maps
        g++ -o start maps.o main.o -lSDL -lSDL_image

er hängt bei dem Aufruf von testTileType = new TileType();

So wie ich das Ganze verstanden habe, deklariere ich die Klassen in der Headerdatei maps.h, definiere sie dann in der maps.cpp, kann sie allerdings in meiner main,cpp voll einsetzen. Ausführbar wird das ganze allerdings, wenn ich aus den aus main.cpp und maps.cpp erstellten main.o und maps.o eine gemeinsame ausführbare Datei erstelle. Das sollte laut makefile auch so sein, funktioniert auch, wenn ich aus main.cpp nicht auf maps zugreife, bzw nur einen Pointer eines Klassentyps, der aber noch auf kein Objekt zeigt, erstelle. Sobald ich allerdings ein Objekt erstellen will, verweigert er mir mit der obigen Fehlermeldung das compilen. Kann mir das bitte jemand erklären?

lg
Dece
 
Hi

Das ist zwar nicht das eigentliche Problem, aber:
Wenn du im main schon ein "new irgendwas" machst
gehört später (vor Programmende) auch ein delete hin.

Das Hauptproblem:
Das, was bei dir in der cpp-Datei steht ist das, was eigentlich in die h gehört.
Was in die cpp sollte sind Funktionen, die in der h nur mit Namen und Typ stehen.

Beispiel
h:
C++:
class klasse
{
private:
    float variable1;
    float variable 2;
public:
    float summe();
    float produkt();
};
cpp:
C++:
float klasse::summe()
{
    return variable1 + variable2;
}
float klasse::produkt()
{
    return variable1 * variable2;
}
Da du in deinen Klassen nirgends Funktionen hast ist die cpp-Datei eigentlich hinfällig.

Das, was zurzeit in deiner h-Datei ist, ist zu Folgendem gut:
Klassen, Variablen etc. müssen theoretisch immer vor den Stellen gemacht werden,
bei denen sie verwendet werden.
C++:
class klasse1
{
};
class klasse2
{
private:
    klasse1* k1;
};
wäre also in Ordnung,
C++:
class klasse2
{
private:
    klasse1* k1;
};
class klasse1
{
};
aber nicht. Fehler.
C++:
class klasse1
{
private:
    klasse2* k2;
};
class klasse2
{
private:
    klasse1* k1;
};
Spätestens hier hat man ein Problem. Was zuerst schreiben?
Deswegen kann man mit einem alleinstehenden "class klassenname;"
im Voraus bekanntgeben, dass die Klasse später noch kommen wird.
 
Zurück