说,我有一些课程,Music
,Video
,Photo
,并且有一个名为Control
的课程,Control
有一个方法,{{ 1}},centerlcall(char* fuction_name,char* json_para)
可以是fuction_name
,Music
,Video
的成员方法之一。所以,我想从Photo
的{{1}}函数调用成员方法。
Control
我怎么能这样做?它有用吗?
我想要的不是让我们直接调用音乐的getMusic或其他,而是打电话给centercall,并告诉centercall他想要调用什么方法,它就像ajax。
答案 0 :(得分:3)
足够的功能指针!有面向对象的方式!
class Stuff {
public:
virtual ~Stuff();
virtual void get(char* data) = 0;
};
class Music : public Stuff{
public :
Music();
void get(char* data);
}
class Video : public Stuff {
public:
Video();
void get(char* data);
}
class Photo : public Stuff {
public:
Photo();
void get(char* data);
}
class Control {
public:
Control();
void centerlcall(Stuff* hisStuff, char* json_para){
hisStuff->get(/* whatever */);
}
}
美丽。
“谢谢,我想使用像jni这样的东西,像音乐这样的每个类都有一个注册方法来注册导出的方法来控制,但我不知道怎么写它。”
class Control {
public:
Control();
void centerlcall(Stuff* hisStuff, char* json_para){
hisStuff->get(/* whatever */);
}
void registerStuff (Stuff* hisStuff) { // <- It's that easy!
// push it to a vector or a list or whatever data collection you want
}
}
答案 1 :(得分:1)
由于这些类没有任何共同之处,因此您必须保存要在某处调用的函数。请注意,C ++不会为您执行此操作,不存储类似函数名称的元数据,您必须自己执行此操作,例如:
class Control {
std::unordered_map<std::string,std::function<void(char*)>> functions;
public:
Control();
centerlcall(char* fuction_name,char* json_para){
functions[function_name](json_para);
}
}
当然你仍然需要在地图上添加相关的功能,也许你想要的是键不是功能名,而是对象名+功能名,....或者不是重新发明轮子,您可以使用事件/信号库,它应该为您提供适当的框架来实现这一目标。
无关:请不要使用char*
之类的内容,而是使用std::string
。