解析命令行参数并使用它们来初始化必须使用抽象工厂模式实现的应用程序

时间:2016-01-29 07:48:56

标签: c++ design-patterns function-pointers functor

我编写了一个解析命令行并初始化应用程序但是使用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])(&param[2]);
        }

//some more code
return 0;
}

可以看出,代码在C中,我需要用C ++编写。我是C ++的菜鸟。我已经阅读了很多文章,但尚未具备任何具体内容。不知道如何使用C ++实现这一点。

我打电话的方法可能来自不同的班级。我认为使用仿函数可以实现这一点。但不确定。如果任何一个人可以举一个小例子,从我将把事情向前推进,将会很有帮助。还需要使用抽象工厂模式。

1 个答案:

答案 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);
}

当然,您将此自由函数和静态函数移动到工厂类中。您还可以创建工厂层次结构并将整个事物转换为抽象工厂模式,但老实说,我认为没有任何意义。