Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我如何引用c++;外面的方法?_C++_Qt - Fatal编程技术网

C++ 我如何引用c++;外面的方法?

C++ 我如何引用c++;外面的方法?,c++,qt,C++,Qt,比如说,我有一些类,Music,Video,Photo,还有一个名为Control,Control有一个方法,centercall(char*fuction\u name,char*json\u para),fuction\u name可以是音乐,视频的一个,Photo的成员方法。因此,我想从Control的centercall函数调用member方法 class Contact { pubilc: Contact(); void getallcontact(char* data); v

比如说,我有一些类,
Music
Video
Photo
,还有一个名为
Control
Control
有一个方法,
centercall(char*fuction\u name,char*json\u para)
fuction\u name
可以是
音乐
视频的一个,
Photo
的成员方法。因此,我想从
Control
centercall
函数调用member方法

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 . 
   }
}
我怎么做呢?满了吗


我想要的不是让usr直接调用Music的getMusic或其他,而是调用centercall,告诉centercall他想要调用什么方法,这类似于ajax。

函数指针就够了!用面向对象的方式

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这样的东西,像music这样的每个类都有一个regist方法来注册要控制的导出方法,但我不知道如何编写它。”

类控制{
公众:
控制();
void centercall(Stuff*histuff,char*json_para){
他的东西->获取(/*无论什么*/);
}

空类寄存器({数据){//< p>因为类没有任何共同点,所以必须保存你想调用的函数。注意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);
   }
}
类控制{
std::无序的_映射函数;
公众:
控制();
CenterCal(字符*功能\名称,字符*json \段落){
函数[函数名称](json_段落);
}
}
当然,您仍然需要将相关函数添加到映射中,也许您希望键不是函数名,而是对象名+函数名,…。或者您可以使用事件/信号库,它应该为您提供适当的框架来完成此操作,而不是重新发明轮子


无关:请不要使用像
char*
,而是使用
std::string

当你调用
getMusic
时,你希望发生什么?请使用适当的标点符号,文本很难阅读。我想逗号是开着的sale@mike视频、照片……存储在哪里?如果你想,你可以在我这里存储n控件。不,我不会更改函数名,这只是一个示例,不同的类会有不同的方法。@mike随你的便。谢谢,我想使用类似jni的东西,像音乐这样的每个类都有一个regist方法来注册导出的控件方法,但我不知道如何编写它。@mike,不客气。还有,请记住er:只要有可能,就用面向对象的方法来做!这是一个糟糕的建议。面向对象只是一个适合一系列问题的可能概念,除了面向对象之外,还有足够多的编程范例,可以更好地匹配各种各样的问题。是的,我想用这样的方法,但是我可以添加一个c++的方法来映射吗?是的,你可以,只要阅读bi就可以了t关于和;)。请注意,如果您不能使用C++11,几乎所有这些都可以在boost中使用。
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);
   }
}