-3

比如说,我有一些类 , Music, Video,Photo并且有一个名为 的类Control,Control有一个方法, centerlcall(char* fuction_name,char* json_para),fuction_name可能是Music, Video,Photo的成员方法之一。所以,我想从函数中调用成员方法Controlcentercall

class Contact {
 pubilc:
 Contact();
 void getallcontact(char* data);
 void changeContact(char* data);
 void addacontact(char* data);
};

class Music {
 public :
 Music();
 void getMusic(char* data);
 void addMusic(char* data);
 void playMusic(char* data);
}

class Video {
 public:
 Video();
 void getVideo(char* data);
 void addVideo(char* data);
}

class Photo {
 public:
 photo();
 void getPhoto(char* data);
}

class Control {
   public:
   Control();
   centerlcall(char* fuction_name,char* json_para){
      //check function_name is in video ,photo,music ,if in , call the method . 
   }
}

我该怎么做?qt有帮助吗?

我想要的不是让usr直接调用Music的getMusic或其他方法,而是调用centercall,并告诉centercall他想调用什么方法,就像ajax一样。

4

2 回答 2

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 之类的东西,每个音乐之类的类都有一个 regist 方法来注册导出到 Control 的方法,但我不知道怎么写。”

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
      }
}
于 2013-02-01T08:34:14.247 回答
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);
   }
}

当然你还是要在map中添加相关的函数,也许你希望key不是函数名而是对象名+函数名,...。或者,您可以使用事件/信号库而不是重新发明轮子,它应该为您提供适当的框架来执行此操作。

无关:请不要使用类似的东西char*std::string而是使用。

于 2013-02-01T08:45:49.797 回答