在 Qt 应用程序及其插件中使用 Singleton 类

2023-12-02

我正在尝试在我的 Qt 应用程序中使用 Singleton 类(它是一个名为“PrisLog”的程序范围调试记录器)。该程序还有插件。我想让我的单例类可供这些插件使用,但这不起作用。据我所知,尝试在插件中使用该类会导致创建另一个实例。

- 单例类只是一个 *.cpp 和 *.h 文件,没有别的。我已将我的主应用程序和插件分别链接到这些文件...这是正确的方法吗?

-我在下面附上了我的单例类的代码,尽管我认为我已经正确创建了该类。如果我在主应用程序的单独类中使用它,它会按预期工作(一个实例)。

编辑:将应用程序和插件链接到同一个静态库(单例类)是有效的。这是我的 qmake *.pro 文件的样子:

MySingletonLib.pro

模板=库

CONFIG += 静态库

标头 += \ mysingletonlib.h

来源+= \ mysingletonlib.cpp

MyPlugin.pro(还包括 myplugin.h 中的 #include mysingletonlib.h)

INCLUDEPATH += 路径/到/MySingletonLib

LIBS += -Lpath/to/MySingletonLib -lMySingletonLib

MyPlugin.pro(还包括 myapp.h 中的#include mysingletonlib.h)

INCLUDEPATH += 路径/到/MySingletonLib

LIBS += -Lpath/to/MySingletonLib -lMySingletonLib

以及原始代码:

#ifndef PRISLOG_H
#define PRISLOG_H

#include <QFile>
#include <QDir>
#include <QString>
#include <QMutex>
#include <QDebug>
#include <QMutexLocker>
#include <QTextStream>
#include <QDateTime>

// PrisLog (singleton) class definition
class PrisLog
{

public:
    static PrisLog* Instance();

    void SetLogsPath(QString);
    QString GetLogsPath();

    void SetDebugDestination(QString);
    void SetElmRxDestination(QString);
    void SetElmTxDestination(QString);
    void SetDlgDestination(QString);

    QTextStream* GetDebugStream();
    QTextStream* GetElmRxStream();
    QTextStream* GetElmTxStream();
    QTextStream* GetDlgStream();

    QMutex* GetDebugMutex();

private:
    PrisLog();                          // private constructor
    PrisLog(const PrisLog&);            // prevent copy constructor
    PrisLog& operator=(const PrisLog&); // prevent assignment

    static PrisLog* m_Instance;
    static bool m_InitFlag;

    QString m_appPath;

    QFile m_DebugFile;
    QTextStream m_DebugStream;
    QMutex m_DebugMutex;

    QFile m_ElmRxFile;
    QTextStream m_ElmRxStream;

    QFile m_ElmTxFile;
    QTextStream m_ElmTxStream;

    QFile m_DlgFile;
    QTextStream m_DlgStream;

};

// thread-UNSAFE writer, but less expensive
// use: single stream <--> single thread!
class PrisLogWriter
{

public:
    PrisLogWriter(QTextStream*);
    ~PrisLogWriter();

    QTextStream* m_stream;
};

// thread-UNSAFE writer, but less expensive
// this version does not include any formatting
// use: single stream <--> single thread!
class PrisLogRawWriter
{

public:
    PrisLogRawWriter(QTextStream*);
    ~PrisLogRawWriter();

    QTextStream* m_stream;
};

// thread-safe writer
// use: single stream <--> many threads
class PrisLogSafeWriter
{

public:
    PrisLogSafeWriter(QTextStream*, QMutex*);
    ~PrisLogSafeWriter();

    QTextStream* m_stream;

private:
    QMutex* m_mutex;
};


#define PRISLOGDEBUG (*(PrisLogSafeWriter(PrisLog::Instance()->GetDebugStream(), PrisLog::Instance()->GetDebugMutex()).m_stream))
#define PRISLOGELMRX (*(PrisLogWriter(PrisLog::Instance()->GetElmRxStream()).m_stream))
#define PRISLOGELMTX (*(PrisLogWriter(PrisLog::Instance()->GetElmTxStream()).m_stream))
#define PRISLOGDLG (*(PrisLogRawWriter(PrisLog::Instance()->GetDlgStream()).m_stream))


#endif // PRISLOG_H

我认为你应该将此类带到静态链接但分离的共享 dll/so 中。

如果您的主机应用程序不使用此类,则链接器不会将其链接到二进制文件中,并且您的插件无法使用它。另外:您的二进制文件没有库类接口。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Qt 应用程序及其插件中使用 Singleton 类 的相关文章

随机推荐