在 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.
我有三个文件 main.cpp ,lnflogic.cpp 和 listmodel.cpp 这是 listlogic.cpp
的构造函数我在 main.cpp
中像这样实例化 lnflogicLnfLogic 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.