在 C++ 中访问在 class 的构造函数中创建的 object

Access an object created in the constructor of a class in c++

我有三个文件 main.cpp ,lnflogic.cpp 和 listmodel.cpp 这是 listlogic.cpp

的构造函数

我在 main.cpp

中像这样实例化 lnflogic
LnfLogic logic;

我想访问 m_lnflistmodel 中名为 themesinfo 的 class(它在其 header 中创建为名为 m_themes 的 QList)

调试时我可以看到 m_themes 已经创建(如下图所示,我如何访问它? 这是文件

LnfLogic.cpp

#include "lnflogic.h"
#include "lnflistmodel.h"
 LnfLogic::LnfLogic()
    : m_themeName(QStringLiteral("org.kde.breeze.desktop")),
      m_lnfListModel(new LnfListModel(this)),
      m_needsSave(false)
{
    m_package = KPackage::PackageLoader::self()->loadPackage(QStringLiteral("Plasma/LookAndFeel"));
}

LnfLogic::~LnfLogic()
{
}

LnfListModel *LnfLogic::lnfList()
{
    return m_lnfListModel;
}

**listmodel Constructors 它有两个 classes themesinfo 和 lnflistmodel **

#include "lnflistmodel.h"
LnfListModel::LnfListModel( QObject *parent )
: QAbstractListModel( parent )
{
    m_roleNames.insert(Qt::DisplayRole, "displayRole");
    m_roleNames.insert(PackageNameRole, "packageNameRole");
    m_roleNames.insert(PackageDescriptionRole, "packageDescriptionRole");
    m_roleNames.insert(PackageAuthorRole, "packageAuthorRole");
    m_roleNames.insert(PackageVersionRole, "packageVersionRole");

    reload();
}

LnfListModel::~LnfListModel()
{
    clearThemeList();
}

这是 listmodel

的 header 文件
#ifndef LNFLISTMODEL_H
#define LNFLISTMODEL_H

#include <QAbstractItemView>

namespace Plasma
{
}

//Theme selector code by Andre Duffeck (modified to add package description)
//not sure if i would need this 
class ThemeInfo
{
public:
    QString name;
    QString package;
    QString description;
    QString author;
    QString version;
    QString themeRoot;
};

class LnfListModel : public QAbstractListModel
{
    Q_OBJECT
    Q_PROPERTY(int count READ count NOTIFY countChanged)
public:
    enum { PackageNameRole = Qt::UserRole,
           PackageDescriptionRole = Qt::UserRole + 1,
           PackageAuthorRole = Qt::UserRole + 2,
           PackageVersionRole = Qt::UserRole + 3
         };

    explicit LnfListModel(QObject *parent = nullptr);
    ~LnfListModel() override;

    QHash<int, QByteArray> roleNames() const override;

    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    QModelIndex indexOf(const QString &path) const;
    bool themeExists(const QString &name) const;
    void reload();
    void clearThemeList();
    int count() const
    {
        return rowCount();
    }

    Q_INVOKABLE QVariantMap get(int index) const;

Q_SIGNALS:
    void countChanged();

private:
    QHash<int, QByteArray> m_roleNames;

    QList<ThemeInfo> m_themes;
};

lnflogic header 文件

#define LNFLOGIC_H

#include <QAbstractListModel>
#include <kpackage/package.h>

class LnfListModel;

class LnfLogic : public QObject
{
    Q_OBJECT

    Q_PROPERTY(LnfListModel *lnfList READ lnfList CONSTANT)
    Q_PROPERTY(QString theme READ theme WRITE setTheme NOTIFY themeChanged)
    Q_PROPERTY(bool isWritable READ isWritable NOTIFY themeChanged)
    Q_PROPERTY(QString themeFolder READ themeFolder NOTIFY themeChanged)

    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
    Q_PROPERTY(QString comment READ comment WRITE setComment NOTIFY commentChanged)
    Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged)
    Q_PROPERTY(QString email READ email WRITE setEmail NOTIFY emailChanged)
    Q_PROPERTY(QString version READ version WRITE setVersion NOTIFY versionChanged)
    Q_PROPERTY(QString website READ website WRITE setWebsite NOTIFY websiteChanged)
    Q_PROPERTY(QString license READ license WRITE setLicense NOTIFY licenseChanged)
    Q_PROPERTY(QString thumbnailPath READ thumbnailPath NOTIFY themeChanged)

    Q_PROPERTY(bool performLayoutDump READ performLayoutDump WRITE setPerformLayoutDump NOTIFY performLayoutDumpChanged)
    Q_PROPERTY(bool performDefaultsDump READ performDefaultsDump WRITE setPerformDefaultsDump NOTIFY performDefaultsDumpChanged)

    Q_PROPERTY(bool needsSave READ needsSave NOTIFY needsSaveChanged)

public:
    enum ErrorLevel
    {
        Info,
        Error
    };
    Q_ENUMS(ErrorLevel)

    LnfLogic();
    ~LnfLogic() override;

    LnfListModel *lnfList();

    bool themeExists(const QString &plugin);

    void setTheme(const QString &theme);
    QString theme() const;

    bool isWritable() const;
    QString themeFolder() const;

    QString name() const;
    void setName(const QString &name);

    QString comment() const;
    void setComment(const QString &comment);

    QString author() const;
    void setAuthor(const QString &author);

    QString email() const;
    void setEmail(const QString &email);

    QString version() const;
    void setVersion(const QString &version);

    QString website() const;
    void setWebsite(const QString &website);

    QString license() const;
    void setLicense(const QString &license);

    bool performLayoutDump() const;
    void setPerformLayoutDump(bool dump);

    bool performDefaultsDump() const;
    void setPerformDefaultsDump(bool dump);

    QString thumbnailPath() const;

    void dumpPlasmaLayout(const QString &pluginName);

    bool needsSave();

    Q_INVOKABLE void save();
    Q_INVOKABLE void createNewTheme(const QString &pluginName, const QString &name, const QString &comment, const QString &author, const QString &email, const QString &license, const QString &website);
    Q_INVOKABLE void processThumbnail(const QString &path);
    Q_INVOKABLE QString openFile();

    void dumpCurrentPlasmaLayout();
    void dumpDefaultsConfigFile(const QString &pluginName);

Q_SIGNALS:
    void themeChanged();
    void messageRequested(ErrorLevel level, const QString &message);
    void needsSaveChanged();
    void nameChanged();
    void commentChanged();
    void authorChanged();
    void emailChanged();
    void versionChanged();
    void websiteChanged();
    void licenseChanged();
    void performLayoutDumpChanged();
    void performDefaultsDumpChanged();

private:
    QString m_themeName;
    KPackage::Package m_package;
    LnfListModel *m_lnfListModel;
    QHash<QString, QString> m_tempMetadata;
    bool m_performLayoutDump : 1;
    bool m_performDefaultsDump : 1;
    bool m_needsSave;
};

#endif // LNFLOGIC_H

现在我可以看到头文件,我看到 m_lnfListModel 是一个指针,而不是一个对象。我还看到有一种方法可以访问这个 ponter lnfList。所以要访问指针,它只是 logic.lnfList().

现在记住 lnfList 返回的是一个指针,所以如果你想说重新加载列表(不管那是什么意思),它会是

logic.lnfList()->reload();
使用

-> 是因为我们正在处理一个指针。

如果您想将列表保存在变量中,那就是

LnfListModel* ptr = logic.lnfList();

然后(再次使用重载示例)

ptr->reload();

但是请注意这里的 ptr 是一个指针,所以你不是从 logic 变量中复制列表,你在这里拥有的是一种访问列表的方式logic 变量。

我希望这很清楚。很明显,这是您从某处获得的代码,而不是您自己编写的代码。为了充分利用它,您可能应该花一些时间学习 C++ 本身的术语,而不是仅仅尝试使用此代码。任何介绍 C++ 的书籍都将涵盖我在这里非常简要提到的主题。您可以找到一些书籍推荐 here.