2017-03-23 99 views
1

我正在尝试使用Poco :: Util :: Application创建一个小应用程序,因为它为您提供了一些诸如配置和记录器之类的功能。它也给你的一个东西是一个config()成员,它返回一个LayeredConfiguration对象。根据文档,您可以使用诸如setString和getString之类的方法。C++ POCO命令行处理

但是,我在解析命令行参数时遇到了使用此配置部分的问题。这个问题似乎与变量范围有关。如果我使用回调函数并在this-> config()对象中设置参数,则该值不会“粘住”。一旦它返回到main(),该值将被重置为默认值。

下面是一个小例子:

#include <Poco/Util/Application.h> 

#include <Poco/Util/Option.h> 
#include <Poco/Util/OptionSet.h> 
#include <Poco/Util/OptionCallback.h> 

#include <iostream> 

class OptionExample : public Poco::Util::Application 
{ 
protected: 
    void initialize(Poco::Util::Application& application){ 
     this->config().setString("optionval", "defaultoption"); 
     this->loadConfiguration(); 
     Poco::Util::Application::initialize(application); 
    } 

    void uninitialize(){ 
     Poco::Util::Application::uninitialize(); 
    } 

    void defineOptions(Poco::Util::OptionSet& optionSet) { 
     Poco::Util::Application::defineOptions(optionSet); 

     optionSet.addOption(
       Poco::Util::Option("optionval", "", "Some value") 
         .required(false) 
         .repeatable(true) 
         .argument("<the value>", true) 
         .callback(Poco::Util::OptionCallback<OptionExample>(this, &OptionExample::handleMyOpt)) 
     ); 
    } 

    void handleMyOpt(const std::string &name, const std::string &value) { 
     std::cout << "Setting option " << name << " to " << value << std::endl; 
     this->config().setString(name, value); 
     std::cout << "The option is now " << this->config().getString(name) << std::endl; 
    } 

    int main(const std::vector<std::string> &arguments) { 
     std::cout << "We are now in main. Option is " << this->config().getString("optionval") << std::endl; 
    } 
}; 

POCO_APP_MAIN(OptionExample) 

不带命令行参数运行它按预期工作:

$ ./Minimal
我们现在正处于主。选项为default选项

使用命令行参数运行它,显示选项已设置。但是,从main()获得选项后,它将被重置为默认值。

$ ./Minimal --optionval = MyString的

设置选项optionval到MyString的

的选项现在的MyString

现在我们是在主。选项是默认选项

正如我所说,我期待变量的范围正在这里杀死我的某处。但是,我已经尝试了各种变体,例如

Poco::Util::Application &application = Poco::Util::Application::instance(); 
std::cout << application.config().getString("optionval"); 

其产生相同的结果。

POCO的文档相对广泛。在github上的源代码中有一些例子,但这个特殊的东西似乎缺少。

有人可以启发我吗?

回答

1

答案似乎很简单。

显然,只有在initialize()中调用config()。setString()调用时才会出现该错误。

通过将调用移动到defineOptions(),默认值按预期工作。