1. 程式人生 > >單例模式與靜態成員

單例模式與靜態成員

很好 nullptr () 單例 配置 ora pri 文件 初始

高博的《視覺SLAM十四講》中,project裏的Config類,很好的示範了單例模式的實現與static靜態成員的使用

每天早上起床拜一拜高博~

Config類是為了設置配置文件,並且從配置文件中讀取預設的參數值。

由此,不難理解,在整個程序運行過程中最多只允許Config類有一個對象(只能有一個配置文件),所以使用單例模式

單例模式的實現,參考http://blog.csdn.net/hackbuteer1/article/details/7460019

在Config類的實現方法就是:1 構造函數設為private成員; 2 使用一個靜態全局指針來保存單例; 3 類內一個public成員函數來訪問該指針

 

上代碼

config.h:

class Config
 2 {
 3 private:
   // static 全局指針,在此處定義,但是一般不在類內初始化
 4     static std::shared_ptr<Config> config_;
 5     cv::FileStorage file_;
 6     
 7     Config () {} // 構造函數是私有成員
 8 public:
 9     ~Config();  // 析構函數,關閉已打開的文件 
10     
11     // 設置配置文件 ,static 靜態成員
12     static void
setParameterFile( const std::string& filename ); 13 14 // 模板函數,讀取配置文件中的參數值 15 template< typename T > 16 static T get( const std::string& key ) 17 { 18 return T( Config::config_->file_[key] ); 19 } 20 }

頭文件中定義的數據成員 static std::shared_ptr<Config> config_; 還有成員函數static void setParameterFile( const std::string& filename );

都是靜態成員,表示他們不是屬於對象的成員,

而是屬於整個類的。

靜態數據成員並不是在類創建對象的時候定義和初始化,因此肯定不能在構造函數中初始化。而且一般不在類內初始化,相反,必須放到類的外部定義和初始化。

也就是下面config.cpp文件中的最後一句。

類似於全局變量,靜態數據成員定義在所有函數之外,因此一旦被定義就存在程序的整個生命周期之中。

定義靜態數據成員的方法就和在類外定義成員函數差不多,需要指定類型名sharedPtr<Config>(智能指針類型),類名Config,作用域運算符::,以及成員的名字 config_

  -- 摘自c++primer

config.cpp:

void Config::setParameterFile( const std::string& filename )
{
    if ( config_ == nullptr )
        config_ = shared_ptr<Config>(new Config);
    config_->file_ = cv::FileStorage( filename.c_str(), cv::FileStorage::READ );
    if ( config_->file_.isOpened() == false )
    {
        std::cerr<<"parameter file "<<filename<<" does not exist."<<std::endl;
        config_->file_.release();
        return;
    }
}

Config::~Config()
{
    if ( file_.isOpened() )
        file_.release();
}

shared_ptr<Config> Config::config_ = nullptr;

單例模式與靜態成員