C ++シングルトンシングルトンクラスを達成

この記事では、最初の個人的なブログが登場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の下でライセンスされています。

おすすめ

転載: www.cnblogs.com/kezunlin/p/11836051.html