我正在练习如何制作单身人士。
一切都进行得很好,直到我决定玩为止。
工作版本为:
sing.hp:
class GlobalClass
{
private:
GlobalClass(int);
int m_value;
static GlobalClass *s_instance;
// static GlobalClass instance;
public:
int get_value();
void set_value(int v);
static GlobalClass *GetS_instance();
// static GlobalClass GetInstance();
};
sing.cpp
#include"sing.hpp"
#include<iostream>
using namespace std;
GlobalClass * GlobalClass::s_instance = 0;
//GlobalClass GlobalClass::instance;
GlobalClass::GlobalClass(int v = 10)
{
this->m_value = v;
}
int GlobalClass::get_value()
{
return this->m_value;
}
void GlobalClass::set_value(int v)
{
this->m_value = v;
}
GlobalClass * GlobalClass::GetS_instance()
{
if (!s_instance)
{
s_instance = new GlobalClass;
}
return s_instance;
}
//GlobalClass GlobalClass::GetInstance()
//{
//
// return instance;
//}
main.cpp:
#include "sing.hpp"
#include<iostream>
using namespace std;
void foo(void)
{
GlobalClass::GetS_instance()->set_value(1);
cout << "foo: global_ptr is " << GlobalClass::GetS_instance()->get_value() << '\n';
}
int main()
{
cout << "main: global_ptr is " << GlobalClass::GetS_instance()->get_value() << '\n';
foo();
return 1;
}
在我对我的评论发表评论之前,以上设置非常有效。
我收到以下错误:
~/workspace/singleton2$ g++ *.cpp -o dr
sing.cpp:6:27: error: no matching function for call to ‘GlobalClass::GlobalClass()’
sing.cpp:6:27: note: candidates are:
sing.hpp:5:2: note: GlobalClass::GlobalClass(int)
sing.hpp:5:2: note: candidate expects 1 argument, 0 provided
sing.hpp:2:7: note: GlobalClass::GlobalClass(const GlobalClass&)
sing.hpp:2:7: note: candidate expects 1 argument, 0 provided
除了不知道为什么会发生之外,奇怪的是:错误消息的第一行指向我在程序中定义实例的第6行,而错误表明我的构造函数中有错误。
您能帮我解决这个问题吗?
谢谢你们
最佳答案
您按值返回会生成一个无法使用的副本,因为您不希望Singeltons具有副本构造函数。
更改为通过引用返回:
GlobalClass & GlobalClass::GetInstance()
// ^^^
{
return instance;
}
在这里时,请确保禁用复制构造函数和赋值运算符
更新默认参数的位置错误。
GlobalClass::GlobalClass(int v = 10)
// ^^^^^ Remove this
{
this->m_value = v;
}
private:
GlobalClass(int v = 10);
// ^^^^^^ Add this
参见:C++ Singleton design pattern