我有下一个情况:
我应该如何在插件( 3。)之间共享主应用程序( 2。)中的单例? Qt / C ++中是否有任何功能可以做到这一点?
目前我正在使用基于共享内存的丑陋解决方案,我不认为这是正确的。
我正在考虑使用依赖注入模式进行重构,但它会带来一些限制。
示例:
静态库“log.lib”:
struct Log
{
void write( QString text );
};
主要应用程序“app.exe”:
Log *logger = new Log; // I need only one logger for all application
int main()
{
logger->write( "Main" );
...
}
插件1“plg1.dll”
extern Log *logger; // Logger from "app.exe"
void Foo()
{
logger->write( "Foo" );
}
插件2“plg2.dll”
extern Log *logger; // Logger from "app.exe"
void Bar()
{
logger->write( "Bar" );
}
答案 0 :(得分:1)
是的,按顺序排列:
我个人只是正确使用单例模式,插件也可以查询实例。请看下面的Qt宏:
Q_GLOBAL_STATIC( Type, VariableName)
创建一个名为VariableName的QGlobalStatic类型的全局和静态对象,其行为是指向Type的指针。 Q_GLOBAL_STATIC创建的对象在第一次使用时初始化,这意味着它不会增加应用程序或库的加载时间。此外,该对象在所有平台上以线程安全的方式初始化。
您可以轻松地在其上构建单例模式,实际上这甚至是线程安全的。
在这里,您可以找到另一个不使用Q_GLOBAL_STATIC
但QObject
继承的示例,并通过我们在项目中实现的QCoreApplication
来促进工作。
上面这个版本也是线程安全的。