この記事では、最初の個人的なブログが登場https://kezunlin.me/post/8932eaec/ようこそ!
シングルトンクラスとC ++での使用。
ガイド
何を解決するシングルトン?
シングルトンは、1つだけ問題を解決します。
リソースの競合。
あなたは、いくつかのリソースを持っている場合(1)単一のインスタンスを有することができ、そして
(2)あなたは、その単一のインスタンスを管理する必要がある
あなたがシングルトンを必要とします。
多くの例がありません。ログファイルは大きなものです。あなただけの単一のログファイルを放棄する必要はありません。あなたはフラッシュ、同期したいとそれを正しく閉じます。これは、管理する必要がある単一の共有リソースの例です。
それはあなたがシングルトンを必要とすることはまれです。彼らはしている悪い理由は、彼らが世界のように感じると、彼らはGoFのデザインパターンの本の完全払込メンバーだということです。
あなたが世界の必要があると思うとき、あなたはおそらくひどい設計ミスを作っています。
ローカル静的オブジェクト
実際には、C ++で好ましい方法であるローカル静的オブジェクト。
純粋なシングルトン
class Singleton
{
private:
Singleton();
public:
Singleton(Singleton const&) = delete;
Singleton& operator=(Singleton const&) = delete;
static Singleton& instance()
{
static Singleton INSTANCE;
return INSTANCE;
}
};
シングルトンとのshared_ptr
class Singleton
{
private:
Singleton();
public:
Singleton(Singleton const&) = delete;
Singleton& operator=(Singleton const&) = delete;
static std::shared_ptr<Singleton> instance()
{
static std::shared_ptr<Singleton> s{new Singleton};
return s;
}
};
シングルトン用法
#define DISALLOW_COPY(TypeName) \
TypeName(const TypeName&)
#define DISALLOW_ASSIGN(TypeName) \
TypeName& operator=(const TypeName&)
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
TypeName& operator=(const TypeName&)
class CSingleton
{
public:
static CSingleton &GetInstance()
{
static CSingleton instance;
return instance;
}
void DoSomething()
{
printf("void CSingleton::DoSomething() called.\n");
}
private:
CSingleton() {};
DISALLOW_COPY_AND_ASSIGN(CSingleton);
};
// usage
CSingleton::GetInstance().DoSomething(); // OK
CSingleton& singleton = CSingleton::GetInstance(); // OK with reference
singleton.DoSomething();
CSingleton singleton = CSingleton::GetInstance(); // ERROR (copy constructor)
例
config.hの
#pragma once
class Config
{
public:
static Config& GetInstance(std::string filename="./config.ini");
~Config();
private:
Config(std::string filename);
Config(const Config& ref) {}
Config& operator =(const Config& ref) { return *this; }
};
config.cpp
#include "Config.h"
/*
static config instance will only be created once by calling Config::Config,
when program exit,static variable will be destoryed by calling Config::~Config.
*/
Config& Config::GetInstance(std::string filename)
{
static Config instance(filename);
return instance;
}
Config::Config(std::string filename)
{
std::cout << "[LOG] Config::Config count= "<<count << std::endl;
// load config from filename
// ...
}
Config::~Config()
{
std::cout << "[LOG] Config::~Config count= " << count << std::endl;
}
mysqldb.cpp
void MysqlDb::load_config(std::string filename)
{
this->mysql_connection = Config::GetInstance(filename).MYSQL_CONNECTION;
this->mysql_username = Config::GetInstance(filename).MYSQL_USERNAME;
this->mysql_password = Config::GetInstance(filename).MYSQL_PASSWORD;
this->mysql_database = Config::GetInstance(filename).MYSQL_DATABASE;
this->max_connection_pool_size = Config::GetInstance(filename).MAX_CONNECTION_POOL_SIZE;
}
参照
歴史
- 20180122:作成しました。
著作権
- 投稿者:kezunlin
- ポストリンク:https://kezunlin.me/post/8932eaec/
- 著作権:別途明記しない限り、このブログのすべての記事はCC BY-NC-SA 3.0の下でライセンスされています。