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

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

1

30.09.2011, 18:29

error C2504: 'Event': Basisklasse undefiniert

Liebe Spieleprogrammierer!

Ich schlage mich bei c++ immer mit demselben Problem herum: Headerdateien werden mehrfach oder gar nicht eingebunden und der linker wirft errors. Bisher bin ich immer iwie drum herumgekommen und habs doch irgendwie geschafft aber diesmal komm ich einfach nicht weiter.

Ich habe dieses forum durchsucht und google und die einzigen antworten sind:
1) per #pragma once bzw #ifndef sicher stellen dass alles genau einmal geladen wird
2) die richtigen headerdateien einbinden und alle forwarddefinitionen auch später zu ende definieren
3) Forwarddefinitionen in jedem classheader zu jeder in der klasse verwendeten klasse machen

Hab ich alles gemacht und geprüft aber leider hilft das nicht. Die lösung ist sicher ganz einfach aber ich seh sie nicht :/

Ich liste mal alle Errors auf die ich bekomme und dann die zugehörigen classdefinitions

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1>Event.cpp
1>c:\dokumente und einstellungen\neidhart\eigene dateien\visual studio 2008\projects\textgamemaker\textgamemaker\eventinitgame.h(10) : error C2504: 'Event': Basisklasse undefiniert

... und dann später ...
1>EventInitGame.cpp
1>c:\dokumente und einstellungen\neidhart\eigene dateien\visual studio 2008\projects\textgamemaker\textgamemaker\eventinitgame.h(10) : error C2504: 'Event': Basisklasse undefiniert
1>c:\dokumente und einstellungen\neidhart\eigene dateien\visual studio 2008\projects\textgamemaker\textgamemaker\eventinitgame.cpp(6) : error C2614: 'EventInitGame': Unzulässige Elementinitialisierung: 'Event' ist weder Basis noch Element
1>c:\dokumente und einstellungen\neidhart\eigene dateien\visual studio 2008\projects\textgamemaker\textgamemaker\eventinitgame.cpp(17) : error C2065: 'codelines': nichtdeklarierter Bezeichner
1>c:\dokumente und einstellungen\neidhart\eigene dateien\visual studio 2008\projects\textgamemaker\textgamemaker\eventinitgame.cpp(17) : error C2228: Links von ".begin" muss sich eine Klasse/Struktur/Union befinden.
1>    Typ ist ''unknown-type''
1>c:\dokumente und einstellungen\neidhart\eigene dateien\visual studio 2008\projects\textgamemaker\textgamemaker\eventinitgame.cpp(17) : error C2065: 'codelines': nichtdeklarierter Bezeichner
1>c:\dokumente und einstellungen\neidhart\eigene dateien\visual studio 2008\projects\textgamemaker\textgamemaker\eventinitgame.cpp(17) : error C2228: Links von ".end" muss sich eine Klasse/Struktur/Union befinden.
1>    Typ ist ''unknown-type''
1>c:\dokumente und einstellungen\neidhart\eigene dateien\visual studio 2008\projects\textgamemaker\textgamemaker\eventinitgame.cpp(25) : error C2352: 'Event::run': Unzulässiger Aufruf einer nicht statischen Memberfunktion
1>    c:\dokumente und einstellungen\neidhart\eigene dateien\visual studio 2008\projects\textgamemaker\textgamemaker\event.h(27): Siehe Deklaration von 'Event::run'


Und nun die zugehörigen Klassen

Event.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
#ifndef EVENT_H
#define EVENT_H

#include <vector>
#include <map>
#include <string>
#include <iostream>
#include "EventHandler.h"
#include "VariableContainer.h"

using namespace std;

class CodeLine;
class EventHandler;
class VariableContainer;

class Event {
protected:
vector<CodeLine> codelines;
private:
string ID;
VariableContainer *pVarcont;
EventHandler *pEventhandler;
public:
Event(string newID, VariableContainer *varcontPointer, EventHandler *evhandPointer);
string getID();
map<string, string> run();
void addCodeline(CodeLine line);

};



#endif


EventInitGame.h:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "Event.h"
#include "EventHandler.h"

#ifndef EVENT_INIT_GAME
#define EVENT_INIT_GAME

class EventHandler;
class Event;

class EventInitGame : public Event {
public:
//EventInitGame(string newID, VariableContainer *varcontPointer, EventHandler *evhandPointer);
EventInitGame(string newID, VariableContainer *varcontPointer, EventHandler *evhandPointer);
string initGame();
};

#endif


EventInitGame.cpp:

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
#include "EventInitGame.h"

using namespace std;

EventInitGame::EventInitGame(string newID, VariableContainer *varcontPointer, EventHandler *evhandPointer) : Event(newID, varcontPointer, evhandPointer)
{}

//todo
/*EventInitGame::EventInitGame(Event *ev) : Event("InitGame", NULL, NULL){
//ID = "InitGame";
//pVarcont = NULL;
//pEventhandler = NULL;
}*/

string EventInitGame::initGame(){
string startEvent = "";
for (vector<CodeLine>::iterator It = codelines.begin(); It != codelines.end(); It++){
if (It->compareInstructionName("Input"))
throw new NeidroException("Input instruction is forbidden in InitGame");

if (It->compareInstructionName("SetStartEvent")){
startEvent = It->getParameters()[0];
}
}
Event::run();

return startEvent;
}


Event.cpp

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include "Event.h"

/*Event::containsInstruction(string instruction){
    for (vector<CodeLine>::iterator It = codelines.begin(); It != codelines.end(); It++){
        if (It->compareInstructionName(instruction))
            return true;
    }

    return false;
}*/

void Event::addCodeline(CodeLine line){
    codelines.push_back(line);
}

Event::Event(string newID, VariableContainer *varcontPointer, EventHandler *evhandPointer){
    ID = newID;
    pVarcont = varcontPointer;
    pEventhandler = evhandPointer;
}

string Event::getID(){
    return ID;
}

map<string, string> Event::run(){
    map<string, string> eventMap;
    for (vector<CodeLine>::iterator It = codelines.begin(); It != codelines.end(); It++){
        string instructionName = It->getInstructionName();

        CodeLine currentLine = *It;
        currentLine.decode(pVarcont);
//      printf("new line: %s\n", currentLine.getText().c_str());
        try{
            if (currentLine.compareInstructionName(""))
                cout << currentLine.getText() << endl ;
            else if(currentLine.compareInstructionName("Input")){
                eventMap.insert(pair<string, string>(currentLine.getParameter(0),currentLine.getParameter(1)));
            }
            else if(currentLine.compareInstructionName("RunFunction")){
                map<string,string> returnedEvents = pEventhandler->runEvent(currentLine.getParameter(0));
            }
            else if(currentLine.compareInstructionName("SetStartEvent")){
                if (ID.compare("InitGame")!=0)
                    throw new NeidroException("You must not set a start event outside InitGame");
            }
            else if (currentLine.compareInstructionName("SetVar")){
                pVarcont->setValue(currentLine.getParameter(0), currentLine.evaluateParam());
            }
            else if (currentLine.compareInstructionName("IncVar")){
                pVarcont->increase(currentLine.getParameter(0), currentLine.evaluateParam());
            }
            else if (currentLine.compareInstructionName("DecVar")){
                pVarcont->decrease(currentLine.getParameter(0), currentLine.evaluateParam());
            }
            else if (currentLine.compareInstructionName("SaveInput")){
                string input;
                char buffer[1024];

                cin.getline(buffer, 1024);
                input = buffer;

                pVarcont->setValue(currentLine.getParameter(0), input);

                eventMap.insert(pair<string, string>("\aForceNextEventImmediately", currentLine.getParameter(1)));
            }
            else if (currentLine.compareInstructionName("EndIf")){
                // ignore
            }
            else if (currentLine.compareInstructionName("Elsif") | currentLine.compareInstructionName("Else")){
                // You will only get here when you processed an #if or #elsif block
                // immediatele before so ignore block and jump to #endif
                int level = 0;
                while (It != codelines.end()){
                        It++;
                        if (It->compareInstructionName("EndIf")){
                            if (level == 0)
                                break;
                            else
                                level --;
                        }

                        if (It->compareInstructionName("If"))
                            level ++;

                }
            }
            else if (currentLine.compareInstructionName("If")){
                if (!currentLine.conditionIsTrue(pVarcont)){
                    while (It != codelines.end()){  // search #elsif, #else or #endif
                        It++;
                        if (It->compareInstructionName("Elsif")){
                            if (It->conditionIsTrue(pVarcont))
                                break;  // go on here
                        }
                        else if (It->compareInstructionName("Else")){
                            break; // go on here
                        }
                        else if (It->compareInstructionName("EndIf")){
                            break; // go on here
                        }
                    }
                }
            }
            else{
                throw new NeidroException("Error: unknown instruction: " + currentLine.getText());
            }
        }catch (NeidroException *Ex){
            cout << Ex->what() << endl;
        }
        // process line for line
    }

    return eventMap;
}


Das Projekt besteht auch nohc aus einer Reihe von mehr Klassen und zugehörigen definitionen aber dies sind die beiden klassen die in allen compilermeldungen auftauchen, andere errors gibt es nicht. Ich muss dazu sagen dass beide Klassen vorher einwandfrei gearbeitet haben bis ich eine weitere Klasse eingebunden habe (das war EventHandler). Daraufhin hab ich mein Projekt umstrukturiert dass es wirklich zu jeder klasse sowohl eine .cpp als auch eine .h datei gibt und überall brav forwarddefinitions gemacht. Die meisten compilermeldungen sind daraufhin verschwunden aber das hier ist eben übriggeblieben. Ich poste bei bedarf gerne das ganze Projekt aber ich denke das hier sollten die relevanten dateien sein

Danke für eure Hilfe!
lg, neido

Werwofl

Treue Seele

Beiträge: 100

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

2

30.09.2011, 18:56

Hm kannst du kurzären was das

C-/C++-Quelltext

1
2
class Event;
class EventHandler;

Bzw. Andere Konstrukte
in jeder Header-Datei soll? Sowas habe ich ehrlich nur bei Prottypeing gesehen und das kommt mir da doch ein wenig sinnlos vor:P.

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

3

30.09.2011, 19:13


4

30.09.2011, 19:17

Vorwärtsdeklaration. <.<

Überlege einfach wo du die Header wirklich benötigst. Achte des weiteren auf so etwas: Event.h bindet Eventhandler.h und VariableContainer.h ein.
EventInitGame.h bindet nun Event.h und, unnötigerweise, Eventhandler.h ein, aber der wird ja schon in Event.h eingebunden.
Korrigiere das erst einmal.

MfG
Check

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

5

30.09.2011, 19:35

Ich habe wie gesagt mit #ifndef sicher gestellt dass jede .h nur einmal geladen wird, außerdem sollte es doch gültig sein 10000 forwarddeclarations zu machen wenn man es hinterher einmal definiert.

Ich hab den überflüssigen header entfernt, dieselben 8 fehler bleiben

//Edit: Wenn ich die class Event; forwarddeclaration wegmach ändert sich übringens auch nix

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »neido« (30.09.2011, 19:59)


Werwofl

Treue Seele

Beiträge: 100

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

6

30.09.2011, 20:17

Ja, aber du definierst die Klasse ja hinterher gar nicht. Du bindest einen Header ein der die Klasse ja schon definiert hat(!).

Also nimm erstmal alle forward-declarations raus, aus all deinen Headern. Ich vermute mal du hast dir da Namens-Konflikte reingebaut.

Tante Edit nochmal:
Sowie ich es gelernt habe ist forware-declaration nur sinnvoll wenn sich mehrere Klassen in der selben Datei befinden.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
class A;
class B;

class A{
// bla
}

class B{
// blabla
}

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

7

30.09.2011, 20:32

133 Fehler - Inclusive der schon bekannten...

Edit: Nochmal die beiden classheader

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "Event.h"
//#include "EventHandler.h"

#ifndef EVENT_INIT_GAME
#define EVENT_INIT_GAME

//class EventHandler;
//class Event;

class EventInitGame : public Event {
public:
//  EventInitGame(string newID, VariableContainer *varcontPointer, EventHandler *evhandPointer);
    EventInitGame(string newID, VariableContainer *varcontPointer, EventHandler *evhandPointer);
    string initGame();
};

#endif


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
#ifndef EVENT_H
#define EVENT_H

#include <vector>
#include <map>
#include <string>
#include <iostream>
#include "EventHandler.h"
#include "VariableContainer.h"

using namespace std;

//class CodeLine;
//class EventHandler;
//class VariableContainer;

class Event {
protected:
    vector<CodeLine> codelines;
private:
    string ID;
    VariableContainer *pVarcont;
    EventHandler *pEventhandler;
public:
    Event(string newID, VariableContainer *varcontPointer, EventHandler *evhandPointer);
    string getID();
    map<string, string> run();
    void addCodeline(CodeLine line);

//  bool containsInstruction(vector<string> instructions);
};



#endif

Werbeanzeige