文件读取Config类

前言:写一个负责参数读取的类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类的静态成员部分,请参考之前的博客。

猜你喜欢

转载自blog.csdn.net/try_again_later/article/details/88745272