【发布时间】:2015-11-27 19:32:27
【问题描述】:
问题陈述:
给定交互式输入,在适当的对象(Bank、BankRegister、BasicAccount 等)上调用适当的方法。
输入(每个命令单独一行):
create_bank <bank_name>\n
create_customer <bank_number> <customer_name>\n
create_account <bank_number> <customer_number>\n
deposit <amount> <account_number>/<bank_number>\n
etc...
建议的解决方案:
#include <functional>
bool create_bank(const string& arguments){
const string& bankName = arguments; //no need to parse here
bankRegister.registerBank(new Bank(bankName,
&bankRegister)); //can't access bankRegister!
return true;
}
int main(){
map<string, function<bool (string)>> commands;
commands.emplace("create_bank",create_bank);
...
BankRegister bankRegister;
string command, arguments;
cin>>command;
getline(cin, arguments);
commands[command](arguments);
...
}
为什么它不起作用:
- 无法从函数访问 bankRegister 对象。我可能会通过对函数的常量引用来传递它,但只有一些函数需要它。我正在考虑将其成员 (m_banks, m_next_bankNumber) 设为静态,但随后我必须将它们公开,这可能是一个糟糕的设计决策。
- 参数解析应该在哪里进行?这样可以吗?
-
返回值应该代表什么?
a) 参数解析成功
b) 参数解析成功,命令成功执行
我对一些错误使用异常,但除了 cerr 之外,有些是静默的。
我可以在这里使用可变参数函数来解析参数吗?
- 您还有其他需要改进的地方吗?
【问题讨论】:
-
你的意思可能是
commands[command](arguments),没有引号。 -
The bankRegister object can't be accessed from the functions.所以把它作为一个额外的参数传入。或者,使命令成为其成员函数,并将指向成员的指针存储在映射中。 -
@IgorTandetnik 当然。已更正。
-
@IgorTandetnik 我可以通过额外的参数传递它,但只有一些函数需要它。必须修改其他的以采用他们不会使用的参数。我无法更改 BankRegister 的实现。
-
哪些功能可以不用它?示例中的所有命令显然都需要一些代表所有可用银行、账户等的数据结构。
BankRegister是那个结构,不是吗?
标签: c++ function c++11 dictionary variadic-functions