2012-07-29 171 views
2

可能重复:
Can any one provide me a sample of Singleton in c++?
C++ Singleton design pattern
C++ different singleton implementationsC++单例类的getInstance(如Java)

我需要在C++类的Singleton的一些例子,因为我从未写了这样类。 对于java中的一个例子,我可以声明一个静态字段,它是私有的,它在构造函数中初始化,getInstance方法也是静态的,并返回已经初始化的字段实例。

在此先感谢。

+1

不,首先你需要一个很好的理由来使用单身人士,然后你需要另一个很好的理由,然后*然后*我们可以谈论这样做。 – delnan 2012-07-29 11:01:29

+2

请避免单身。他们几乎总是工作的错误工具。 [阅读](http://jalf.dk/singleton) – jalf 2012-07-29 11:05:54

+0

搜索之前问:http://stackoverflow.com/questions/1008019/c-singleton-design-pattern – 2012-07-29 11:13:14

回答

1

实施例:
logger.h:

#include <string> 

class Logger{ 
public: 
    static Logger* Instance(); 
    bool openLogFile(std::string logFile); 
    void writeToLogFile(); 
    bool closeLogFile(); 

private: 
    Logger(){}; // Private so that it can not be called 
    Logger(Logger const&){};    // copy constructor is private 
    Logger& operator=(Logger const&){}; // assignment operator is private 
    static Logger* m_pInstance; 
}; 

logger.c:

#include "logger.h" 

// Global static pointer used to ensure a single instance of the class. 
Logger* Logger::m_pInstance = NULL; 

/** This function is called to create an instance of the class. 
    Calling the constructor publicly is not allowed. The constructor 
    is private and is only called by this Instance function. 
*/ 

Logger* Logger::Instance() 
{ 
    if (!m_pInstance) // Only allow one instance of class to be generated. 
     m_pInstance = new Logger; 

    return m_pInstance; 
} 

bool Logger::openLogFile(std::string _logFile) 
{ 
    //Your code.. 
} 

的详细信息中:

http://www.yolinux.com/TUTORIALS/C++Singleton.html

+1

它的工作原理谢谢:) – 2012-07-29 11:04:38

+0

链接到外部资源不是一个好主意。如果这些网站消失了,那么你的答案对未来的读者就没用了。 – 2012-07-29 14:42:17

+0

@LokiAstari - 你说得对。我已经修复它。 – 2012-07-29 14:44:39

4
//.h 
class MyClass 
{ 
public: 
    static MyClass &getInstance(); 

private: 
    MyClass(); 
}; 

//.cpp 
MyClass & getInstance() 
{ 
    static MyClass instance; 
    return instance; 
} 
+1

它工作的感谢,并也@Roee Gavirel给出了相同的答案 – 2012-07-29 11:07:01

+0

尼斯。我总是使用'getInstance'和'== null'。静态成员的使用很简单但很智能。 – 2012-07-29 14:49:14

+0

其中一个潜在的问题是,实例会在某个未知的时间点被破坏,可能会导致破坏问题的顺序。如果单身人士需要销毁,我会使用这个解决方案,但如果没有,这个解决方案会超过90%。 – 2012-07-29 15:50:10