Hallo Leute,
um mir C++ anzueignen arbeite ich an einem Projekt welcher im Grunde nur ein SDL Wrapper ist. Die "Architektur" der Frameworks wird in etwa so aussehen:
Man hat mehrere Szenen(wobei man nur eine Darstellen kann) in der Szene definiere ich die Objekte und hinterlege diese im Entity Manager. Dieser wird später verschiedene Events der Objekte abfeuern und die Objekte reagieren drauf.
Es wird mehrere Grundlegende Objekte geben und diese kann man dann erweitern, entweder durch Vererbung oder lambdas.
Nach einigen Stunden Entwicklung kann ich nun ein Rechteck mit definierter Größe/Farbe animieren.
Die Animation wird durch so ein lambda ausgelöst
https://github.com/BlackScorp/DwarfForge…ene.cpp#L62-L69
Nun möchte ich noch weitere Events erstellen und auch mit Parametern. In PHP kann ich einem Lambda so viele Parameter übergeben wie ich möchte. In C++ ist es natürlich etwas komplexer und Stackoverflow zeigt mir Antworten mit denen ich nichts anfangen kann.
Was ich im Grunde möchte: Ich habe hier eine Methode "trigger"
https://github.com/BlackScorp/DwarfForge…ce/Entity.h#L48 mit einer optionalen Struktur, wenn ich nun hier
https://github.com/BlackScorp/DwarfForge…/Entity.cpp#L50 den Parameter übergeben möchte, bekomme ich beim Kompilieren ein Fehler:
" no match for call to '(std::map<std::__cxx11::basic_string<char>, std::function<void()> >::mapped_type {aka std::function<void()>}) (EventData*&)'"
Wenn ich C++ richtig interpretiere, will der Compiler mir sagen, dass hier
https://github.com/BlackScorp/DwarfForge…ce/Entity.h#L52 nicht definert wurde, dass das Lambda auch ein Parameter EventData haben kann.
also habe ich das geschrieben:
|
C-/C++-Quelltext
|
1
2
|
private:
std::map<std::string,std::function<void(EventData *data)>> bindings;
|
Damit entstehen noch mehr Compiler Fehler. Letztendlich musste ich noch EventData parameter dranhängen und bekam folgendes:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
|
class Entity {
public:
std::string getId();
void setId(std::string id);
virtual void onDraw(SDL_Renderer* renderer, float interpolation);
virtual void on(std::string eventName,std::function<void (EventData *data)> callback);
virtual void trigger(std::string eventName,EventData *data = nullptr);
protected:
std::string id;
private:
std::map<std::string,std::function<void(EventData *data)>> bindings;
};
|
das Blöde ist, dass diese Definition mich dazu zwingt das Lambda mit einem Parameter zu definieren.
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
|
testRect->on("update", [testRect](EventData *data) {
int x = testRect->getX();
x++;
if(x > 500){
x = 0;
}
testRect->setX(x);
});
|
ich wollte es aber optional machen. Wie muss die Definition für std::map aussehen? Ich komme nicht mehr weiter.
LG BlackScorp