2012-09-14 51 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希望能够在运行时动态选择一个函数,其中的内容是该函数的名称。所有这一切都是设置一个函数指针,然后调用该函数,不是很有用。 –

相关问题