我编写了一个解析命令行并初始化应用程序但是使用C语言的应用程序。但是所需的应用程序是用C ++编写的。以下代码片段提取/解析参数并调用各自的函数。
void (* const OptionFuncPtr[])(char *pstr) = {
(SetA),(GetB), (SetC), (SetD), (Erase), (FOptions), (GOperations),
(ShowHelp), (SetInput), (undefined), (undefined), (SetLBit), (undefined), (undefined),
(OutputData), (ProgramOptions), (ReadAll), (ReadData), (SOptions), (TestMode),
(undefined), (VerifyData), (WOptions), (FillUnspecific), (ReadLBits), (NoProgessIndicator)
};
int main(int argc, char *argv[])
{
...// some code
for( int i = 1; i < argc; i++ )
{
param = argv[i];
/* Allow parameters to start with '-' */
if( param[0] != '-' )
throw new ErrorMsg( "All parameters must start with '-'!" );
if( strlen( param ) <= 1 )
throw new ErrorMsg( "Parameters cannot be just the minus without any characters!" );
value = param[1] - 'a';
if(value > 26)
throw new ErrorMsg("You have not entered a valid command line parameter");
(*OptionFuncPtr[value])(¶m[2]);
}
//some more code
return 0;
}
可以看出,代码在C中,我需要用C ++编写。我是C ++的菜鸟。我已经阅读了很多文章,但尚未具备任何具体内容。不知道如何使用C ++实现这一点。
我打电话的方法可能来自不同的班级。我认为使用仿函数可以实现这一点。但不确定。如果任何一个人可以举一个小例子,从我将把事情向前推进,将会很有帮助。还需要使用抽象工厂模式。
答案 0 :(得分:0)
您的代码是有效的C ++。它做了应有的事情。如果你需要让它看起来更像C ++,你可以创建一个抽象的参数处理程序基类
struct ArgHandler
{
virtual ~ArgHandler();
virtual void operator(const std::string& arg) = 0;
};
从那些中获取ShowHelp
等,然后
ArgHandler& getArgHandler(int i)
{
static std::map<int, std::shared_ptr<ArgHandler>> handlers = {std::make_pair(0, std::make_shared<ShowHelp>(), ...};
// Add some error handling here if i is not found.
return *(handlers.find(i)->second);
}
当然,您将此自由函数和静态函数移动到工厂类中。您还可以创建工厂层次结构并将整个事物转换为抽象工厂模式,但老实说,我认为没有任何意义。