为 class 的每个实例定义不同的函数
Define a different function for each instance of a class
说我有这个 class:
class Object {
public:
int x;
int y;
void update(SDL_Event);
void start();
};
我希望能够使 start
和 update
在实例之间改变行为。
我试过使用函数指针,像这样:
class Object {
public:
int x;
int y;
void (*update)(SDL_Event);
void (*start)(void);
};
void teststart() {
x++;
return;
}
在我的 main()
中,我这样做:
testlevel.objs[1].start = teststart;
但是,我无法从 class.
中引用变量
我确定我忽略了一些明显的东西,但是当指针位于 class 中时在线搜索没有结果。
也许函数指针不是正确答案?
您需要将函数 pointer/reference 传递给 Object
实例,例如:
class Object {
public:
int x;
int y;
void (*doupdate)(Object*, SDL_Event);
void (*dostart)(Object*);
void update(SDL_Event event) { if (doupdate) doupdate(this, event); }
void start() { if (dostart) dostart(this); }
};
void teststart(Object* obj) {
obj->x++;
}
void testupdate(Object* obj, SDL_Event event) {
// update obj as needed...
}
Object &obj = testlevel.objs[1];
obj.dostart = teststart;
obj.doupdate = testupdate;
否则,使用 std::function
捕获 lambda:
#include <functional>
class Object {
public:
int x;
int y;
std::function<void(SDL_Event)> update;
std::function<void()> start;
};
Object *obj = &(testlevel.objs[1]);
obj->start = [obj](){
obj->x++;
};
obj->update = [obj](SDL_Event event){
// update obj as needed...
};
说我有这个 class:
class Object {
public:
int x;
int y;
void update(SDL_Event);
void start();
};
我希望能够使 start
和 update
在实例之间改变行为。
我试过使用函数指针,像这样:
class Object {
public:
int x;
int y;
void (*update)(SDL_Event);
void (*start)(void);
};
void teststart() {
x++;
return;
}
在我的 main()
中,我这样做:
testlevel.objs[1].start = teststart;
但是,我无法从 class.
中引用变量我确定我忽略了一些明显的东西,但是当指针位于 class 中时在线搜索没有结果。
也许函数指针不是正确答案?
您需要将函数 pointer/reference 传递给 Object
实例,例如:
class Object {
public:
int x;
int y;
void (*doupdate)(Object*, SDL_Event);
void (*dostart)(Object*);
void update(SDL_Event event) { if (doupdate) doupdate(this, event); }
void start() { if (dostart) dostart(this); }
};
void teststart(Object* obj) {
obj->x++;
}
void testupdate(Object* obj, SDL_Event event) {
// update obj as needed...
}
Object &obj = testlevel.objs[1];
obj.dostart = teststart;
obj.doupdate = testupdate;
否则,使用 std::function
捕获 lambda:
#include <functional>
class Object {
public:
int x;
int y;
std::function<void(SDL_Event)> update;
std::function<void()> start;
};
Object *obj = &(testlevel.objs[1]);
obj->start = [obj](){
obj->x++;
};
obj->update = [obj](SDL_Event event){
// update obj as needed...
};