2012-09-14 2 views
0

아래는 동적으로 기능 핑을 참조해야전달 문자열 포인터 C++

#include "stdafx.h"  
#include <string.h>  
#include <iostream.h> 

using namespace std; 

class ToDoCommands 
{ 
public:  
    void getCommand(string); 
}; 

void ToDoCommands::getCommand(string command) 
{ 
    cout<<command; //here i get ping 
    void (*CommandToCall)(void); 
    CommandToCall = command; // error here i want something like 
           // CommandToCall = ping 
    CommandToCall(); 
} 

void ping(void) 
{ 
    cout<<"ping command executed"; 
} 

int main() 
{ 
    ToDoCommands obj; 
    obj.getCommand("ping"); 
} 

함수 포인터 내 코드를 작동합니다. 함수 이름과 동일한 문자열이 main의 getCommand 함수에 전달됩니다.

+2

C++ 만하지 않습니다 시도 : 당신은 정말 뭔가를해야 할 경우, 당신은 이름으로 색인 기능의 테이블을해야합니다 그런 식으로 일해라. 이와 같은 것을 정말로 필요로한다면 이름으로 색인 된 함수 테이블을 만들어야 할 것입니다. –

답변

1

C++은 그렇게 작동하지 않습니다.

#include <assert.h> 
#include <iostream> 
#include <map> 
#include <string> 

using std::cout; 
using std::string; 
using std::map; 

void ping(void) 
{ 
    cout << "ping command executed\n"; 
} 

class ToDoCommands 
{ 
    public: 
    typedef void (*FunctionPtr)(); 
    typedef string Name; 

    void registerFunction(Name name,FunctionPtr); 
    void callFunction(Name); 

    private: 
    map<Name,FunctionPtr> func_map; 
}; 

void ToDoCommands::registerFunction(Name name,FunctionPtr func_ptr) 
{ 
    func_map[name] = func_ptr; 
} 

void ToDoCommands::callFunction(Name name) 
{ 
    assert(func_map.find(name)!=func_map.end()); 
    func_map[name](); 
} 

int main(int argc,char **argv) 
{ 
    ToDoCommands to_do_commands; 

    to_do_commands.registerFunction("ping",ping); 
    to_do_commands.callFunction("ping"); 
    return 0; 
} 
+0

thnx 많이 ..... 대신지도 어떻게 여기 배열을 사용할 수 있습니까? .. 아니면 뉴욕 대체? –

+0

@james :지도는 키를 기반으로 항목을 쉽게 찾을 수 있기 때문에 가장 자연 스럽습니다. 배열을 사용하려는 경우 각 항목을 나타내는 또는 어쩌면 구조체 쌍을 작성한 다음 배열을 통해 반복자를 사용하여 원하는 이름으로 항목을 찾습니다. –

0
void ping(void)  
{ 
    // LL DD…DD XX 
    cout<<"ping command executed"<<endl; 
} 

class ToDoCommands  
{ 
public: 
    void getCommand(void (*CommandToCall)(void)); //getCommand(ping) 
}; 

void ToDoCommands::getCommand(void (*CommandToCall)(void)) 
{ 
    void (*CommandToCall1)(void); 
    CommandToCall1 = CommandToCall; 
    CommandToCall1(); 
} 

int main() 
{ 
    ToDoCommands obj; 
    obj.getCommand(ping); 
    return 0; 
} 

내가이와 작업 :

+0

OP는 런타임에 함수의 이름을 내용으로하는 문자열로 함수를 동적으로 선택할 수 있기를 원합니다. 이 모든 것은 함수 포인터를 설정 한 다음 그 함수를 매우 유용하지 않게 호출합니다. –