在类之外明确声明构造函数
我试图通过假定只使用私有构造函数,类的私有实例和公共静态方法来实现单例模式来返回实例。 但是我在Visual Studio中遇到以下代码的错误
// Singleton Invoice
#include <iostream>
using namespace std;
class Singleton {
public:
//Public Static method with return type of Class to access that instance.
static Singleton* getInstance();
private:
//Private Constructor
Singleton();
//Private Static Instance of Class
static Singleton* objSingleton;
};
Singleton* Singleton::objSingleton = NULL;
Singleton* Singleton::getInstance() {
if (objSingleton == NULL) {
//Lazy Instantiation: if the instance is not needed it will never be created
objSingleton = new Singleton();
cout << "Object is created" << endl;
}
else
{
cout << "Object is already created" << endl;
}
return objSingleton;
}
int main() {
Singleton::getInstance();
Singleton::getInstance();
Singleton::getInstance();
return 0;
}
错误为:
LNK2019在函数“public:static class Singleton * __cdecl Singleton :: getInstance(void)”(?getInstance @ Singleton)中引用的未解析的外部符号“private:__thiscall Singleton :: Singleton(void)”(?? 0Singleton @@ AAE @ XZ) @@ SAPAV1 @ XZ)
然后我解决了错误,但在类之外重写了构造函数
Singleton::Singleton() {
}
我想知道错误的原因以及为什么需要在类之外明确写入构造函数。
在类中,构造函数只是被声明的,没有被定义。 定义包括一个功能体。 无论您是在课堂上还是在课堂外(如您所做的那样)将其定义为内联都无关紧要,但有一点不同之处在于,在课堂中定义时隐式inline
。
其他新闻:
单身人士通过避免例如静态初始化次序失败来改善全局变量,但是对于无形的通信线路和副作用而言具有相同的问题。 最好避免。
如果在相应的全局变量被销毁后不需要单例持久化,那么只需使用一个简单的Meyers单例。
这是梅耶斯的单身人士:
class Foo
{
private:
Foo() {}
public:
static auto instance()
-> Foo&
{
static Foo the_instance;
return the_instance;
}
};
默认的构造函数需要一个body:
你可以改变
Singleton();
至
Singleton(){};
在课堂上,它应该工作。
在迈尔单身人士的演变中,我更喜欢价值语义单身人士,原因如下:
class singleton
{
// private implementation
struct impl {
void do_something() { }
};
// private decision as to whether it's really a singleton and what its lifetime
// will be
static impl& instance() { static impl _impl; return _impl; }
public:
// public interface defers to private lifetime policy and implementation
void do_something() { instance().do_something(); }
};
void something(singleton s)
{
s.do_something();
}
int main()
{
// we can now pass singletons by value which gives many benefits:
// 1) if they later become non-singletons, the code does not have to change
// 2) the implementation can be private so better encapsulation
// 3) we can use them in ADL more effectively
auto x = singleton();
something(x);
something(singleton());
}
链接地址: http://www.djcxy.com/p/78847.html
上一篇: Explicitly stating a Constructor outside the class
下一篇: Is Meyers' implementation of the Singleton pattern thread safe?