C++ 如何在Qt中的插件和应用程序之间使用相同的类?

C++ 如何在Qt中的插件和应用程序之间使用相同的类?,c++,qt,C++,Qt,我在Qt中创建了一个插件。插件类和应用类使用名为ShareData的同一个类。 这是ShareData类: //sharedata.h class ShareData { public: ShareData(); }; //sharedata.cpp ShareData::ShareData() { } 但当我在plugin类中创建一个实例时,如下所示: //plugin.pro INCLUDEPATH += $PWD/../echowindow/ //echoplugi

我在Qt中创建了一个插件。插件类和应用类使用名为ShareData的同一个类。 这是ShareData类:

//sharedata.h
class ShareData
{
public:
    ShareData();
};

//sharedata.cpp
ShareData::ShareData()
{

}
但当我在plugin类中创建一个实例时,如下所示:

 //plugin.pro
INCLUDEPATH += $PWD/../echowindow/



 //echoplugin.h  
 #include "sharedata.h"
class EchoPlugin : public QObject, EchoInterface
    {
        Q_OBJECT
        Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.EchoInterface" FILE "echoplugin.json")
        Q_INTERFACES(EchoInterface)

    public:
        EchoPlugin();
        ShareData* sharedata;
    };

//echoplugin.cpp
EchoPlugin::EchoPlugin()
{
    sharedata = new ShareData();
}
然后我运行项目,发现一个错误:

error: undefined reference to `ShareData::ShareData()'
添加这是我的类结构:

-echoplugin
    -echoplugin.pro
    -echopluginwindow
        -echowindow.pro
        -Headers
            -echointerface.h
            -echowindow.h
            -sharedata.h
        -Sources
             -echowindow.cpp
             -main.cpp
             -sharedata.cpp

    -Plugin
        -plugin.pro
        -Headers
            -echoplugin.h
        -Sources
            -echoplugin.cpp

我应该怎么做才能在插件EchoPlugin类中使用ShareData类?

插件应该独立于主应用程序,所以您不能使用其中定义的类。您的构建错误可能是因为shareddata.cpp在插件构建期间未编译

如果您真的想使用这种设计,我建议您为
SharedData
创建库


INCLUDEPATH
仅说明您可以使用shareddata的标题。问题发生在链接阶段。

您是否编译
sharedata.cpp
以及在哪里?非常感谢。我还有另一个问题:除了创建共享数据库之外,还有其他方法可以替代这种设计吗?@Firers问题是你的插件代码使用了
新的共享数据。要使用它,它必须有权访问SharedData构造函数。您可以通过添加到
SOURCES
HEADERS
shareddata.cpp和shareddata.h(使用手动路径)来“给出”它,但您可以得到整个应用程序的链接错误。非常感谢。我将sharedata.h和sharedata.cpp添加到插件中,它成功了。但我还有一个问题。我将ShareData类修改为单例模式类。我在应用程序和插件中使用了两次ShateData类,并在ShareData的构造函数中打印了一些内容。控制台显示它打印了两次。如何在应用程序和插件之间使用单例模式类?你能帮助我吗?谢谢。@FIrers展示您的实现在这里会很有帮助。首先,您应该编写
SharedData*GetInstance()
函数。构造函数应该只在主应用程序中调用,插件应该只在需要时获取指向实例的指针,而不是分配它。使用此模式时,可能不需要将shareddata.cpp添加到插件构建中。在注释中显示我的代码块并不方便。我将代码粘贴到下一个窗口中。你能帮助我吗?非常感谢你。