-3

たとえば、私にはいくつかのクラス、、、、があり、、Musicという名前のクラスがあり、メソッドがあります。 、、、のメンバーメソッドの1つである可能性があります。だから、私はの関数からメンバーメソッドを呼び出したいです。VideoPhotoControlControlcenterlcall(char* fuction_name,char* json_para)fuction_nameMusicVideoPhotoControlcentercall

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 のようなものを使用したいのですが、音楽のようなすべてのクラスには、エクスポートされたメソッドを 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);
   }
}

もちろん、関連する関数をマップに追加する必要があります。おそらく、キーを関数名ではなく、オブジェクト名 + 関数名、... にする必要があります。または、車輪を再発明する代わりに、これを行うための適切なフレームワークを提供するイベント/シグナル ライブラリを使用できます。

無関係: のようなものは使用しないでください。代わりchar*に使用してください。std::string

于 2013-02-01T08:45:49.797 に答える