2013-02-01 2 views
-3

fuction_nameMusic 중 하나 Video, Photo의 멤버 방법이 될 수 Control는 방법, centerlcall(char* fuction_name,char* json_para)을 가지고, 내가 어떤 클래스, Music, Video, Photo이 말을하고, 클래스가 Control 이름이있다. 그래서, 회원 메서드를 Controlcentercall 함수에서 호출하고 싶습니다.어떻게 외부에서 C++ 메소드를 리펙싱 할 수 있습니까?

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을 dirctly 또는 다른 사람에게 전화하지 말고 centercall을 호출하고 centercall에게 그가 호출 할 방법을 알려주지 않으려면 ajax와 유사합니다.

+0

'getMusic'을 호출하면 어떻게 될 것으로 예상됩니까? –

+0

예, 전화 번호는 – mike

+1

입니다. 적절한 문장 부호를 사용하십시오.이 텍스트는 읽기가 매우 어렵습니다. – dandan78

답변

4

함수 포인터가 충분합니다! 그것을 객체 지향적 인 방법으로 만드십시오!

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 */); 
     } 
} 

아름다운.


"덕분에, 내가, 음악 등의 모든 클래스는 컨트롤에 REGIST의 수출 방법에 REGIST 방법이있는 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 
     } 
} 
+0

아니요, 나는 fucntion 이름을 변경하지 않을 것이며, 그것은 단지 샘플 일 뿐이며, 다른 클래스는 다른 메소드를 가질 것입니다. – mike

+0

@mike 그런 식으로 생각 해보세요. –

+0

감사합니다, 나는 jni 같은 것을 사용하고 싶습니다. 음악과 같은 모든 클래스는 등록 된 메소드를 Control에 내보내는 방법을 가지고 있습니다. 그러나 어떻게 작성해야할지 모르겠습니다. – mike

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을 사용하십시오.

+0

예, 이걸 사용하고 싶지만지도에 C++의 메소드를 추가 할 수 있습니까? – mike

+0

예, [std :: bind'] (http://en.cppreference.com/w/cpp/utility/functional/bind)와 ['std :: function'] (http://en.cppreference.com/w/cpp/utility/functional/function);). C++ 11을 사용할 수 없다면 거의 모든 기능이 향상됩니다. – KillianDS

관련 문제