2014-04-09 48 views
0

對於我的項目我正在處理我想從命令提示符向用戶顯示可用的所有可用函數,現在無論如何顯示除打字之外的其他功能從任何一個如何在類中顯示功能

例如:

Functions I want displayed 

bool status(); 
double getTime(); 
void setTime(int h, int min, int sec); 
double getDate(); 
void setDate(int d,int m,int y); 
void setAuto(); 
void turnOn(); 
void turnOff(); 

這些在一個類中聲明我已經叫Audio_Visual.h

//Have a small welcome text 
cout << "Welcome to this Home Automation System" << endl; 
cout << "Here Are a list of functions, please type what you want to do" << endl; 
// DISPLAY FUNCTIONS 

//display current function such as lights.setAuto(); 
string input = ""; 

//How to get a string/sentence with spaces 
cout << "Please enter a valid function" << endl; 
getline(cin, input); 
cout << "You entered: " << input << endl << endl; 

如何編寫了命令行的東西

+0

你可以嘗試解析你的頭。但你沒有具體說明,你想要什麼? – zoska

回答

0

在C++中執行此操作並不容易,因爲它沒有實現Reflection

這樣的結構存在於其他語言(例如Java和C#)中。

+0

那麼,他可以使用一些令人討厭的C宏,比如'#'運算符來對函數的名稱進行字符串。但是,當然,無法遍歷成員函數對它們進行綁定。 – Manu343726

+0

我會認真考慮構建一個JNI。 – Bathsheba

0

我建議你做個表< 函數名,函數指針>。這通常被稱爲查找表。

搜索函數名稱,然後在相同位置取消引用函數指針。

缺點是所有功能必須具有相同的簽名。

另一種選擇是使用工廠設計模式。

+0

那麼查找表就可以用來顯示類的功能了嗎?或者是否可以用於檢查用戶是否輸入了有效的功能 – Tomsta

+0

您必須手動將功能名稱輸入到表格中。是的,如果用戶的文本不在表格中,則函數名稱無效。 –

1

可以使用地圖映射函數名函數指針

typedef void (Audio_Visual::* fv)(); 
std::map<std::string, fv> void_functions; 

std::map<std::string, std::function<void(void)> > void_functions; 

您需要爲不同的簽名不同的地圖:即

typedef double (Audio_Visual::* fd)(); 
std::map<std::string, fd> double_functions; 

std::map<std::string, std::function<double(void)> > double_functions; 

用法:

Audio_Visual a; 
void_functions[ "turnOn"] = &Audio_Visual::turnOn; 
std::cout << "Now we are turning on..."; 
(a.(*void_functions[ "turnOn"]))(); 

在這裏你可以找到更多關於第二個選項:Using generic std::function objects with member functions in one class

0

C++不支持反射,所以沒有辦法來遍歷一個類的成員函數。

不過,我建議你將dessign分成兩部分:「Actions」和執行本身

不同的動作可以做不同的事情(即調用實現端的不同功能)。所以一個動作就是採取必要的用戶輸入並調用正確的實現函數。一些簡單的例子:

void get_status_action() 
{ 
    //Just propmts the status: 
    std::cout << impl.status(); 
} 

void set_time_action() 
{ 
    int hour , minute , second; 

    //Get user input: 
    std::cout << "Please enter the time: "; 
    std::cin >> hour >> minute >> second; 

    //Call the implementation: 
    impl.steTime(hour , minute , second); 
} 

現在你要做的是以一種方式存儲操作,用戶可以輕鬆地選擇它們。使用來自字符串的映射(動作的名稱)到動作。 請注意,在我的示例中,動作只是使用全局實現實例的函數。你可以編寫一些複雜的動作實現,比如函子,類等)。

int main() 
{ 
    std::unordered_map<std::string,std::function<void()>> actions; 

    actions["Set status"] = set_status_action; 
    actions["Set current time"] = set_time_action; 

    while(true) 
    { 
     //Propmt the actions: 

     std::cout << "Select one of the following actions:" << std::endl; 

     for(auto& pair : actions) 
      std::cout << pair.first << std::endl; 

     //Read the selection and execute the proper action: 

     std::string selection; 
     std::getline(std::cin , selection); 

     actions[selection](); 
    } 
}