我正在尝试使用Poco :: Util :: Application创建一个小应用程序,因为它提供了一些东西,例如配置和记录器,就在门外。它还为您提供的一个东西是config()成员,它返回一个LayeredConfiguration对象。根据文档,您可以使用setString和getString等方法。
但是,在解析命令行参数时,我仍然坚持使用此配置部分。问题似乎与变量范围有关。如果我使用回调函数并在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
将选项optionval设置为mystring
该选项现在是mystring
我们现在处于主要阶段。选项是defaultoption
正如我所说,我期待变量范围在这里杀死我。但是,我已经尝试了诸如
之类的变体Poco::Util::Application &application = Poco::Util::Application::instance();
std::cout << application.config().getString("optionval");
产生相同的结果。
POCO的文档相对广泛。在github上的源代码中有一些例子,但是这个特殊的东西似乎缺失了。
有人可以启发我吗?
答案 0 :(得分:0)
答案似乎很容易。
显然,只有在initialize()中完成config()。setString()调用时才会出现错误。
通过将调用移动到defineOptions(),默认值按预期工作。