2017-03-23 98 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(),默認值按預期工作。