C++ 如何在Qt中的插件和应用程序之间使用相同的类?
我在Qt中创建了一个插件。插件类和应用类使用名为ShareData的同一个类。 这是ShareData类: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
//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添加到插件构建中。在注释中显示我的代码块并不方便。我将代码粘贴到下一个窗口中。你能帮助我吗?非常感谢你。