在另一个类的方法内创建一个类的实例

时间:2019-04-29 10:55:56

标签: c++ class qt5

这可能是一个非常基本的C ++问题,但我根本无法找到正确执行此操作的方法:

我需要在我的GUI类的方法中创建“ QPluginLoader”类的某些实例,并将这些实例存储在QList中。 QPluginLoader实例必须在整个GUI类中都可用。 但是,每当我尝试通过我的QList访问QPluginLoader时,程序就会崩溃。我认为这是因为一旦超出实例化QPluginLoader类的作用域,它便被销毁,因此在创建QPluginLoader并将其存储到QList的方法之外,该方法不可用。

但是如何使实例在整个类中可用?

这是我尝试过的:

mainwindow.h

class MainWindow : public QMainWindow
{
    Q_OBJECT

public slots:
    void onThreadTerminated();

private:
    bool loadPlugins();
    QList<QPluginLoader*> loaderList;
};

mainwindow.cpp

bool MainWindow::loadPlugins()
{
    QDir pluginsDir(qApp->applicationDirPath());
    pluginsDir.cd("plugins");

    foreach (QString fileName, pluginsDir.entryList(QDir::Files))
    {
        QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
        QObject* plugin = pluginLoader.instance();

        if (plugin)
        {
            loaderList.push_back(&pluginLoader);
            pluginCount++;
        }
    }
    return false;
}

最后但并非最不重要的是,使我的程序崩溃的插槽

// SLOT
void MainWindow::onThreadTerminated()
{
    while (!loaderList.isEmpty()) {
       if(loaderList.takeFirst()->isLoaded()) loaderList.takeFirst()->unload();
    }
    loaderList.clear();
}

2 个答案:

答案 0 :(得分:0)

foreach (QString fileName, pluginsDir.entryList(QDir::Files))
{
    QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));

pluginLoader将在下一个}处销毁,并且您在loaderList中保留此销毁对象的引用。

使用pluginLoader动态为new分配内存,并在QPluginLoader中保留指向loaderList的指针

当然,您必须记住要为QPluginLoader s释放分配的内存

答案 1 :(得分:0)

问题是loadPlugins函数中的这两行

QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
...
loaderList.push_back(&pluginLoader);

第一个定义 local 对象pluginLoader。第二个将指向该本地对象的指针推入容器。

问题在于,当循环迭代(或结束)时,pluginLoader的生命周期结束并且被破坏,指向它的指针变为无效。

在我看来,您不应该具有插件加载程序的容器,而应该具有实际的插件本身。

如果您确实希望在容器中安装插件加载器,则需要使用new动态创建插件加载器,或者至少为其使用智能指针。或者,如对您的问题的评论中所述,请使用QPluginLoader 对象的容器。