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