Roh*_*ews 3 c++ singleton static member
我按照例子使用了singleton calss:
但我得到的错误是"未解析的外部符号"
这是我试过的代码:
#include<iostream>
using namespace std;
class singleton
{
int value;
static singleton *instance;
protected:
singleton()
{
value=0;
}
public:
static void initialize()
{
if(instance==NULL)
singleton();
else
cout<<"An instance of singleton already exist...";
}
static singleton& getInstance()
{
return *instance;
}
int getValue()
{
return value;
}
};
void main()
{
singleton::initialize();
}
Run Code Online (Sandbox Code Playgroud)
关于Singleton类的一点解释真的很棒.它使用的场景.优点和缺点.Singleton的替代品.等等
首先,我想:
singleton();
Run Code Online (Sandbox Code Playgroud)
应该:
instance = new singleton();
Run Code Online (Sandbox Code Playgroud)
你有它的方式,你不实际存储的新实例化对象,以便instance将永远是空的.
使用以下方法显式设置静态也是一种很好的形式:
singleton *singleton::instance = 0;
Run Code Online (Sandbox Code Playgroud)
(课外定义之外).
实际上,最好从基线单例代码开始,然后从那里开始工作.这是标准格式的指针版本:
#include <iostream>
class singleton {
protected:
static singleton *instance;
singleton() { }
public:
static singleton *getInstance() {
if (instance == 0)
instance = new singleton();
return instance;
}
};
singleton *singleton::instance = 0;
int main() {
singleton *s1 = singleton::getInstance();
singleton *s2 = singleton::getInstance();
std::cout << s1 << '\n';
std::cout << s2 << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您可以看到输出中的两个指针都是相同的:
0xbc0358
0xbc0358
Run Code Online (Sandbox Code Playgroud)
或参考版本,因为这似乎是你的目标:
#include <iostream>
class singleton {
protected:
static singleton *instance;
singleton() { }
public:
static singleton& getInstance() {
if (instance == 0)
instance = new singleton();
return *instance;
}
};
singleton *singleton::instance = 0;
int main() {
singleton &s1 = singleton::getInstance();
singleton &s2 = singleton::getInstance();
std::cout << &s1 << '\n';
std::cout << &s2 << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在定义文件中,您需要定义instance:
singleton* singleton::instance = NULL;
Run Code Online (Sandbox Code Playgroud)
如果要在多个翻译单元中使用单例,则应将定义与声明分开.
此外,它通常的方式是没有初始化方法:
static singleton* getInstance()
{
if(instance==NULL)
instance = new singleton();
return instance;
}
Run Code Online (Sandbox Code Playgroud)
关于单身人士的好坏,有很多讨论,普遍的共识是应该避免这些单身人士.你也应该看看它们.