问题描述
我在使用 yaml
解析 yaml-cpp
文件时遇到问题,我正在使用 wxWidgets
创建一个应用程序并且我正在尝试从 {{1 }} 文件看起来像,
yaml
这是应该处理解析的代码,
---
This is the configuration file for the Sample browser,feel free to edit this file as needed
...
Window:
SizeW: 1280
SizeH: 720
Media:
Autoplay: false
但是当我尝试解析此文件并设置帧大小 int sizeH,sizeW;
try
{
YAML::Node config = YAML::LoadFile("/home/apoorv/repos/cpp-projects/wxWidgets/Samplebrowser/build/config.yaml");
if (!config["Window"])
{
wxLogDebug("Error! Cannot fetch values.");
}
sizeH = config["SizeH"].as<int>();
sizeW = config["SizeW"].as<int>();
}
catch(const YAML::ParserException& ex)
{
std::cout << ex.what() << std::endl;
}
this->SetSize(sizeW,sizeH);
时,它出错说 this->SetSize()
。
解决方法
由于 SizeH
和 SizeW
是 Window
的孩子,你的两行应该看起来像
sizeH = config["Window"]["SizeH"].as<int>();
sizeW = config["Window"]["SizeW"].as<int>();
或者,与之前的检查合并,
if (auto window = config["Window"]) {
sizeH = window["SizeH"].as<int>();
sizeW = window["SizeW"].as<int>();
} else {
wxLogDebug("Error! Cannot fetch values.");
}
一般来说,错误处理很糟糕。在您的代码中,如果遇到错误,sizeH
和 sizeW
不会设置 ,但仍会提供给 SetSize
。这是未定义的行为。您应该使用一些默认值初始化它们,例如
int sizeH = 480,sizeW = 640;
此外,由于您让我们对 this
的含义一无所知,因此可能存在其他错误。
在学习 yaml-cpp 时尝试这样做是可以的,但是如果您真的想保存/恢复您的框架几何图形,则应改用 wxPersistentTLW。要使用它,只需在创建框架后调用 wxPersistentRegisterAndRestore(frame,"NameToIdentifyYourFrame")
,有关详细信息,请参阅 the manual。
在跨平台环境下,最好保存窗口的客户端大小,对于GTK来说,重要的是客户端大小。可能还有其他操作系统/工具包属于这种情况。