2017-03-23 14 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

以下は、最小限の例です。オプションはdefaultoptionです

コマンドライン引数で実行すると、オプションが設定されていることが示されます。しかし、main()からオプションを取得した後は、デフォルトにリセットされます。

$ ./Minimal --optionval =列MyString

をMYSTRINGするオプションoptionvalを設定するオプションは、今私たちがメインになりました

をMYSTRINGています。オプションはdefaultoptionです

私が言ったように、私は可変スコープがどこかで私を殺してくれることを期待しています。しかし、私はすでに同じ結果をもたらすようなバリエーションを試してきました。

POCOのドキュメントは比較的広範囲です。 githubのソースコードには例がありますが、この特定のものは見当たりません。

誰かが私を啓発できますか?

答えて

1

答えはかなり簡単だったようです。

明らかに、このエラーは、config()。setString()呼び出しがinitialize()で行われた場合にのみ表示されます。

defineOptions()への呼び出しを移動すると、デフォルト値は期待通りに機能します。