【发布时间】:2019-12-19 18:24:35
【问题描述】:
是否可以创建具有 QObject 继承的单例类?添加 QObject 继承后出现编译错误。也许问题在于静态单例创建(应该是动态的)?这是我的方法
标题
#ifndef BLUETOOTHMANAGER_H
#define BLUETOOTHMANAGER_H
#include <QObject>
class BluetoothManager : public QObject
{
Q_OBJECT
public:
virtual ~BluetoothManager() {}
/// Static getter
static BluetoothManager & GetInstance()
{
return instance;
}
private:
/// static Bluetooth manager instance
static BluetoothManager instance;
explicit BluetoothManager(QObject * parent);
};
#endif // BLUETOOTHMANAGER_H
还有cpp文件
#include "BluetoothManager.h"
/// singleton creation
BluetoothManager BluetoothManager::instance = BluetoothManager(static_cast<QObject*>(nullptr));
BluetoothManager::BluetoothManager(QObject * parent)
: QObject(parent)
{
}
在编译过程中出现错误
../QtHealthApp/network/bluetooth/BluetoothManager.cpp:4:94: error: use of deleted function ‘BluetoothManager::BluetoothManager(const BluetoothManager&)’ BluetoothManager BluetoothManager::instance = BluetoothManager(static_cast<QObject*>(nullptr));
^ In file included from /opt/Qt5.12.LTS/5.12.6/gcc_64/include/QtCore/qnamespace.h:43:0,
from /opt/Qt5.12.LTS/5.12.6/gcc_64/include/QtCore/qobjectdefs.h:48,
from /opt/Qt5.12.LTS/5.12.6/gcc_64/include/QtCore/qobject.h:46,
from /opt/Qt5.12.LTS/5.12.6/gcc_64/include/QtCore/QObject:1,
from ../QtHealthApp/network/bluetooth/BluetoothManager.h:4,
from ../QtHealthApp/network/bluetooth/BluetoothManager.cpp:1: ../QtHealthApp/network/bluetooth/BluetoothManager.h:33:20: note: declared here
Q_DISABLE_COPY(BluetoothManager)
^ /opt/Qt5.12.LTS/5.12.6/gcc_64/include/QtCore/qglobal.h:372:5: note: in definition of macro ‘Q_DISABLE_COPY’
Class(const Class &) Q_DECL_EQ_DELETE;\
^
【问题讨论】:
-
尝试返回指向您的
BluetoothManager实例而不是实例本身的指针(在BluetoothManager::GetInstance方法中)。 -
为什么不参考?
-
您遗漏了一些关键代码(使该类成为单例的原因)。
-
@s.paszko 参考很好。
-
为什么不使用built-in singleton macro?