我怎样才能在外面引用c ++方法?

时间:2013-02-01 08:29:47

标签: c++ qt

说,我有一些课程,MusicVideoPhoto,并且有一个名为Control的课程,Control有一个方法,{{ 1}},centerlcall(char* fuction_name,char* json_para)可以是fuction_nameMusicVideo的成员方法之一。所以,我想从Photo的{​​{1}}函数调用成员方法。

Control
我怎么能这样做?它有用吗?

我想要的不是让我们直接调用音乐的getMusic或其他,而是打电话给centercall,并告诉centercall他想要调用什么方法,它就像ajax。

2 个答案:

答案 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