首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单例模式解释

单例模式解释
EN

Stack Overflow用户
提问于 2013-08-29 14:58:18
回答 2查看 115关注 0票数 1

在google的帮助下,我创建了一个单例日志类,即:

代码语言:javascript
复制
class Log{
public:
    void Initialize(const char* fileName, int logLevel, ...);
    void outString(const char* str, ...);
    void outError(const char* str, ...);
    void outWarning(const char* str, ...);
    static Log* GetInstance() 
    {
        if (!m_instance)
            m_instance = new Log();
        return m_instance;
    }
private:
    Log() {}
    Log(const Log&);
    Log& operator=(const Log&); 
private:
    static Log *m_instance;
    void SetColor(bool stdout_stream, Color color);
    string getCurrentTime();
    void ResetColor(bool stdout_stream);
    int m_logLevel;
    ofstream *m_file;
};

现在我想知道这里的*是什么:静态日志*m_instance;为什么我们将它设置为指针?我不太明白。我是说,这意味着什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-29 15:12:08

它是一个指针,因此它最初可以为null;然后在第一次访问上使用new创建实例时指向实例;请参见GetInstance函数。

这是Singleton反模式的“惰性泄漏”变体:实例是在第一次访问时创建的,从未销毁。就像所有在C++中实现单例的尝试一样,它也有一些优点:

  • 无论何时访问该实例,都保证其存在;
  • 实例如果从未被访问,则不会占用任何内存(指针除外)

还有一些缺点:

  • 该实例从未被销毁,因此可以报告为内存泄漏;
  • 每次访问时检查指针的成本(可能较小);
  • 创建并不是线程安全的,使其在每次访问中不引起(可能是主要的)成本而使其线程安全是非常重要的。
票数 2
EN

Stack Overflow用户

发布于 2013-08-29 15:03:49

它是指向类中唯一一个实例的指针。

您可以通过'Log::getInstance()‘静态函数访问这个实例。

当我们在实践中不需要代码中的一个类的多个实例时,我们使用单例模式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18514416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档