單例模式與靜態成員
阿新 • • 發佈:2017-09-02
很好 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;
單例模式與靜態成員