gpt4 book ai didi

qt - 单例模式语法错误静态字段未命名非静态数据成员或基类

转载 作者:行者123 更新时间:2023-12-04 08:13:36 24 4
gpt4 key购买 nike

不要生我的气。我是 C++ 和 qt 的新手
我按照 Gof 的示例使用了单例类
但得到错误

svgview.cpp:11:16: error: member initializer 'm_instance' does not name a non-static data member or base class
我的标题
#ifndef SVGVIEW_H
#define SVGVIEW_H
#include <QGraphicsView>

QT_BEGIN_NAMESPACE
class QGraphicsSvgItem;
class QSvgRenderer;
QT_END_NAMESPACE

class SvgView : public QGraphicsView
{
Q_OBJECT

public:
static SvgView* Instance();
void openFile(const QString &fileName);
QSvgRenderer *renderer() const;

private:
static SvgView* m_instance;
QGraphicsSvgItem *m_svgItem;
SvgView();

};
#endif // SVGVIEW_H
cpp代码:
SvgView::SvgView()
: QGraphicsView()
, m_svgItem(nullptr)
, SvgView::m_instance(nullptr)
{
setScene(new QGraphicsScene(this));
}
QT 5.14.1 minGW
我做错了什么?

最佳答案

您的解决方案是:

SvgView* SvgView::m_instance = 0;
SvgView::SvgView()
: QGraphicsView()
, m_svgItem(nullptr)
{
setScene(new QGraphicsScene(this));
}
SvgView* SvgView::instance(){
if (m_instance==0)
{
m_instance=new SvgView();
}
return m_instance;
}
该模式的这种特定设计选择引入了几个潜在的长期问题:
1.无法使用抽象类或接口(interface)类;
2.难以创建子类;
3. 跨应用高耦合(易包含难于修改或删除);
4.难以测试(不能在单元测试中伪造/模拟);
5.在可变状态的情况下难以并行化(需要大量加锁);
例如,第一个线程可以取消第二行的条件,并在构造函数执行期间被中断。
当第一个线程休眠时,启动第二个线程,代码相同,但是由于第一个线程没有初始化 m_instance,所以第二个线程也调用 SimpleClass 构造函数并返回一个指向创建对象的指针。
之后,可以激活第一个线程,再次结束其对象实例的创建并初始化 m_instance。
要解决竞争问题,您可以使用互斥锁(提供的示例是使用 Qt 库,但同步工具当前包含在标准库中)。
简单的解决方案是使用互斥锁:
#include <QMutex>
SvgView* SvgView::instance(){
static QMutex mutex;
if (m_instance==0)
{
mutex.lock();
if(m_instance==0)
m_instance=new SvgView();
mutex.unlock();
}
return m_instance;
}

关于qt - 单例模式语法错误静态字段未命名非静态数据成员或基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65822841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com