文件读取Config类
程序员文章站
2022-05-28 17:45:41
...
前言: 写一个负责参数读取的类Config,能够只更改default.yaml内容即可,无需在程序内部更改。
获取相机参数:
myslam::Config::setParameterFile("default.yaml");
double fx=myslam::Config::get<double> ("Camera.fx");
直接调用类中成员函数,需要static静态成员函数。
config.h
#ifndef CONFIG_H
#define CONFIG_H
#include "myslam/common_include.h"
namespace myslam
{
class Config
{
private:
//1.类的静态成员,局部static对象,调用方便Config::config_
//2.智能指针自动析构,Config类型
static std::shared_ptr<Config> config_;
cv::FileStorage file_;//对象,作为成员变量?
Config () {} //构造函数,private
public:
~Config(); // 析构函数
// 输入参数地址,类的静态成员函数,调用方便,无需先生成对象。Config::setParameterFile()
static void setParameterFile( const std::string& filename );
// get成员函数,获取任意类型的参数值
template< typename T >
static T get( const std::string& key )
{
return T( Config::config_->file_[key] );//调用static静态成员变量Config::config_
}
};
}
#endif // CONFIG_H
config.cpp
#include "myslam/config.h"
namespace myslam
{
shared_ptr<Config> Config::config_ = nullptr;//成员变量需要初始化,且static关键字只出现在声明部分,定义不出现。
void Config::setParameterFile( const std::string& filename )
{
if ( config_ == nullptr )
config_ = shared_ptr<Config>(new Config);//空,新建new一个Config类对象
config_->file_ = cv::FileStorage( filename.c_str(), cv::FileStorage::READ );
if ( config_->file_.isOpened() == false )//file未打开
{
std::cerr<<"parameter file "<<filename<<" does not exist."<<std::endl;
config_->file_.release();
return;
}
}
Config::~Config()
{
if ( file_.isOpened() )
file_.release();//释放内存
}
}
有关static类的静态成员部分,请参考之前的博客。
下一篇: Mozilla推出“火狐插件集合”服务