Qt 中用Q_GLOBAL_STATIC来实现线程安全的单例模式
  GnNrEyYR0uXU 2024年05月17日 53 0
C++
  1. 官方说明:
    Qt中有个宏Q_GLOBAL_STATIC 可以用来创建一个全局静态变量,下面看下官方文档的说明:

Q_GLOBAL_STATIC(Type, VariableName)
Creates a global and static object of type QGlobalStatic, of name VariableName and that behaves as a pointer to Type. The object created by Q_GLOBAL_STATIC initializes itself on the first use, which means that it will not increase the application or the library's load time. Additionally, the object is initialized in a thread-safe manner on all platforms.
The typical use of this macro is as follows, in a global context (that is, outside of any function bodies):

Q_GLOBAL_STATIC(MyType, staticType)

官方文档说的意思是:
创建名为VariableName的QGlobalStatic类型的全局和静态对象,其行为类似于指向Type的指针。由Q_GLOBAL_STATIC创建的对象在第一次使用时对自身进行初始化,这意味着它不会增加应用程序或库的加载时间。此外,该对象在所有平台上都以线程安全的方式进行初始化。

  1. 使用方法:
    官方的说明中就已经说了使用方法 :Q_GLOBAL_STATIC(MyType, staticType)

  2. 实例说明:
    singleton.h

#ifndef SINGLETON_H
#define SINGLETON_H
#include <QGlobalStatic>

#define SINGLETON Singleton::instance()

class Singleton
{
public:
    Singleton() {}
    virtual ~Singleton() {}
public:
    static Singleton* instance();
public:
    void setValue(int value);
    int getValue();
prive:
    int m_value;
};
#endif // SINGLETON_H

singleton.cpp

#include "singleton.h"
Q_GLOBAL_STATIC(Singleton, theSingleton)
Rule* Singleton::instance()
{
    return theSingleton();
}

void Singleton::setValue(int value)
{
    m_value = value);
}

int Singleton::getValue()
{
    return m_value;
}

调用方法:
如上面的单例在需要调用的地方可以用如下方法来赋值和取值:

Singleton::instance()->setValue(520);
int value = Singleton::instance()->getValue();

也可以直接用定义的宏来调用

SINGLETON->setValue(520);
int value = SINGLETON->getValue();
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2024年05月17日 0

暂无评论

推荐阅读
  8Tw5Riv1mGFK   2024年05月01日   72   0   0 C++
  BYaHC1OPAeY4   2024年05月08日   53   0   0 C++
  yZdUbUDB8h5t   2024年05月05日   40   0   0 C++
  oXKBKZoQY2lx   2024年05月17日   50   0   0 C++
GnNrEyYR0uXU