大佬们,求指导一个单例代码

千梦一生 2020-07-14 01:46:18
今天写代码,实现了一个单例。看上去问题不大

class Signals:public QObject
{
Q_OBJECT
private:
static Signals* obj;
Signals();//忘记delete拷贝、赋值构造了
public:
static Signals* getObj()
{
if(obj == nullptr)//obj必然被初始化为null了的
obj = new Signals();
return obj;
}
}

这是写的Qt的一个全局类,处理那些全局信号的。
然后接着又需要一些其它全局类。然后我觉得还是应当加一个单例,看上去更“完美”一点。

于是想到这里,我就又想。那岂不是又得按这个套路再写一次嘛。多个单例岂不是要重复写一堆
【而我想减少代码量】我尝试写了一下模板,发现不大对劲。构造函数因为单例的原因被private掉了。写成模板只能通过public访问。
-----------这种方案感觉好像有些没办法啊。

不知道大家有没有什么想法或者经验。可否教我一下。
谢谢!
...全文
103 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2020-07-15
  • 打赏
  • 举报
回复
一股MFC味道
千梦一生 2020-07-14
  • 打赏
  • 举报
回复
原来如此。这次提问收获颇丰。
谢谢您对这个问题的进一步补充。
谢谢!
_mervyn 2020-07-14
  • 打赏
  • 举报
回复
这种单例实现不是线程安全的。 在c++11之前没有真正意义上的线程安全的单例。 在c++11之后,因为规定了 静态局部变量的初始化是线程安全的。 所以建议这样实现单例:

static Signals* getObj()
{
	static Signals s_instance;
	return &s_instance;
}
另外,个人非常不喜仅为了某个功能就去用继承(个人喜好)。 所以我不会建议用继承。 这种情况,可以用宏定义:

#define IMPLEMENT_SINGLETON(ClassName)  \
public:                                 \
	static ClassName* getObj() {        \
		static ClassName s_instance;    \
		return &s_instance;	         \
	}
使用:

class Signals
{
	IMPLEMENT_SINGLETON(Signals)
private:
	Signals(){}
	~Signals(){}
};
千梦一生 2020-07-14
  • 打赏
  • 举报
回复
刚才跑了一下能如期望一样运行。
而且思路是之前我没有想到的方向。protected考虑过,但没有想到可以反过来继承:

与目标实体形成继承关系,通过构造自身单例来构造目标实体的单例。强啊
非常谢谢这位老师提供的方式。
感谢!
真相重于对错 2020-07-14
  • 打赏
  • 举报
回复
这样呢?
#include<iostream>
using namespace std;
template <class T>
class TEST:T
{
private:
    static TEST* obj;
public:
    static T* getObj()
    {
        if(obj==nullptr)
            obj = new TEST();
        return obj;
    }
};
template<typename T>
TEST<T>* TEST<T>::obj;
class TEST2
{
protected:
    int x;
protected:
    TEST2() {}

};



int main() {
    TEST2* P= TEST<TEST2>::getObj();
    return 0;
}
真相重于对错 2020-07-14
  • 打赏
  • 举报
回复
我晕了。。。。。。
真相重于对错 2020-07-14
  • 打赏
  • 举报
回复
构造函数没必要时private的改成protected的,然后test2public 继承test
千梦一生 2020-07-14
  • 打赏
  • 举报
回复
引用 1 楼 真相重于对错 的回复:
模板???
指的是什么???
stl吗??

您好,我自己想尝试写的一个这样单例的模板

template <class T>
class TEST
{
private:
static T* obj;
public:
static T* getObj()
{
if(obj == nullptr)
obj = new T();//但这里翻车了,下面的TEST2的构造函数必然要private。这里便访问不到了
return obj;
}
};

class TEST2:TEST<TEST2>
{
//我想上面写一个这样的模板。然后后面那些单例都可以像这样:TEST2* obj = TEST<TEST2>::getobj();设想的很美好
};
真相重于对错 2020-07-14
  • 打赏
  • 举报
回复
模板??? 指的是什么??? stl吗??

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧