2012-09-14 52 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希望能夠在運行時動態選擇一個函數,其中的內容是該函數的名稱。所有這一切都是設置一個函數指針,然後調用該函數,不是很有用。 –

相關問題