我正在嘗試在我的 C 程式中創建一個選單系統,但在執行初始主選單時遇到了麻煩。
我想要有多個 Menu 物件,我將它們傳遞給我的函式呼叫showMenu(),該函式呼叫與相應選單項配對的函式。
我應該將函式指標存盤在向量中嗎?任何建議都是有幫助的——解決方案越干凈越好。
這是我的代碼:
struct Menu {
vector<string> items;
vector<function> functions; // incorrect
};
Menu mainMenu = {
{ "Quit", "Income Menu", "Expenses Menu" },
{ return, showMenu(incomeOptions), showMenu(expenseOptions) } // incorrect
};
Menu incomeOptions = {
{"Back" , "Add Income", "Edit Income"},
{ return, addIncome(), editIncome()} // incorrect
};
Menu expenseOptions = {
{"Back" , "Add Expense", "Edit Expense"},
{ return, addExpense(), editExpense()} // incorrect
};
void showMenu(Menu menu, string title = "") {
system("cls");
if (title != "") {
cout << "================ [" << title << "] ================" << endl;
cout << endl;
}
for (int i = 0; i < menu.items.size(); i ) {
cout << " (" << i << ") " << menu.items[i] << endl;
}
int selection;
cout << "\t> ";
cin >> selection;
if (selection >= 0 && selection < menu.items.size()) {
// call function that's paired with selected item
menu.functions[selection];
}
else {
// invalid selection made, display menu again
showMenu(menu, title);
}
}
int main() {
showMenu(mainMenu, "Main Menu");
}
我試圖研究 c library 。我很確定這就是我所需要的,但就像我說的,在實施它時遇到了麻煩。我很想得到一些建議。
uj5u.com熱心網友回復:
您必須為 std::function 提供模板引數:
struct Menu
{
vector<string> items;
vector<function<void(void)>> functions;
};
而且你可以將 lamdas 傳遞給它:
Menu incomeOptions = {
{"Add Income", "Edit Income"},
{[]{ addIncome(); }, []{ editIncome(); }}
};
Menu expenseOptions = {
{"Add Expense", "Edit Expense"},
{[]{ addIncome(); }, []{ editIncome(); }}
};
Menu mainMenu = {
{"Income Menu", "Expenses Menu"},
{[]{ showMenu(incomeOptions); }, []{ showMenu(expenseOptions); }}
};
您將不得不以不同的方式處理退貨。
無論如何,將選單存盤為全域變數并不是一個好主意。你應該改變這個!但請注意,對于 mainMenu,您必須將其他選單添加到其 lambdas 的捕獲中。
int main()
{
Menu incomeOptions = {
{"Add Income", "Edit Income"},
{[]{ addIncome(); }, []{ editIncome(); }}
};
Menu expenseOptions = {
{"Add Expense", "Edit Expense"},
{[]{ addIncome(); }, []{ editIncome(); }}
};
Menu mainMenu = {
{"Income Menu", "Expenses Menu"},
{[&incomeOptions]{ showMenu(incomeOptions); }, [&expenseOptions]{ showMenu(expenseOptions); }}
};
showMenu(mainMenu, "Main Menu");
}
將選單按值傳遞給 showMenu 函式是一種資源浪費。隨意修改以供參考。
void showMenu(Menu &menu, string title = "")
{
// ...
}
而在你的showMenu功能。呼叫該函式還需要使用括號。
menu.functions[selection]();
呼叫showMenu無效輸入并不是最好的主意,因為這些遞回呼叫會在一段時間后吃掉你的堆疊。我建議將其更改為回圈。
而且,using namespace std;從長遠來看,添加到您的代碼中是一種不好的做法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/532416.html
上一篇:C編程遞回分段錯誤
