我需要单例实现而不使用动态内存分配。我试图像这样实现它:
// Singleton.hpp
class Singleton
{
public:
static Singleton& GetInstance();
private:
Singleton();
static Singleton& Instance;
};
// Singlton.cpp
Singleton& Singleton::GetInstance()
{
return Singleton::Instance;
}
Singleton::Singleton()
{
}
正如我所说,这不会编译。我阅读了很多文章,我尝试以不同的方式初始化static Singleton& Instance
,但我得到的只是一个新的编译错误。为什么这不起作用?如何在不使用动态内存分配的情况下实现单例模式?
答案 0 :(得分:2)
您还需要声明GetInstance
方法静态,否则您只能在现有对象上调用它 - 并且您无法创建现有对象,因为构造函数是私有的。
P.S。而不是将实例创建为类的静态成员,您可以将其设置为GetInstance
中的静态局部变量。
P.P.S。我刚刚注意到你的Instance
变量是一个你没有初始化的引用 - 这也不起作用。这是我的版本:
Singleton & GetInstance()
{
static Singleton Instance;
return Instance;
}
答案 1 :(得分:0)
您对Instance
的定义不应与标题中的Singleton& Instance;
类似。它必须是Singleton Instance;
,因为它不是引用而是对象。
您已在标头中声明Singleton::Instance
但未在源中定义它。您需要将Singleton Singleton::Instance;
放在源文件中。需要在源文件中定义非常量静态对象。
您需要将getInstance
方法声明为静态,这样您就不需要实际的对象来调用它。如果是静态的,您可以使用Singleton::getInstance();
来调用它。
答案 2 :(得分:0)
这样:
class Singleton
{
public:
static Singleton& getInstance();
~Singleton();
private:
Singleton();
Singleton(Singleton&); // don't implement
void operator=(const Singleton&); // don't implement
};
#include "singleton.hpp"
Singleton& Singleton::getInstance()
{
static Singleton instance;
return instance;
}
Singleton::Singleton()
{
}
Singleton::~Singleton()
{
}
按照您的“OPP方式”执行此操作,您只需初始化instance
变量:
class Singleton
{
public:
static Singleton& getInstance();
~Singleton();
private:
Singleton();
Singleton(Singleton&); // don't implement
void operator=(const Singleton&); // don't implement
static Singleton instance;
};
Singleton Singleton::instance;
Singleton& Singleton::getInstance()
{
return instance;
}
Singleton::Singleton()
{
std::cout << "ctor" << std::endl;
}
Singleton::~Singleton()
{
}
用此测试:
int main() {
Singleton& s = Singleton::getInstance().getInstance();
s.getInstance();
}
构造函数只会被调用一次......但是这样你就失去了懒惰的初始化。
答案 3 :(得分:0)
这就是我为我的单身人士所做的事情:
我在班上添加了一个数据成员static int Count ;
。
所以现在我有:
声明static Singleton::Count = 0;
和构造函数:
Singleton()
{
Count++;
}
我的实例是:
static Singleton GetInstance()
{
Singleton obj;
if ( Count == 1)
return obj;
}