我很茫然。我有一个类对象,我在其中将属性设置为int值。但是,当我查看该值或尝试通过代码检索它时,它将返回一个巨大的负数。为什么会这样?
然后我根据列表中字符串位置的索引设置实际值,如下所示:
-1163005939
MyObject.h
#ifndef MYOBJECT_H
#define MYOBJECT_H
#include <QObject>
#include <QString>
class MyObject : public QObject
{
Q_OBJECT
public:
explicit MyObject(QObject *parent = nullptr);
MyObject(const QString &title, QObject *parent = nullptr);
QString title;
QString getTitle() const;
void setTitle(const QString &value);
int index;
int getIndex() const;
void setIndex(const int &value);
signals:
public slots:
private:
};
#endif // MYOBJECT_H
MyObject.cpp
#include "myobject.h"
MyObject::MyObject(QObject *parent) : QObject(parent)
{
}
MyObject::MyObject(const QString &title, QObject *parent) : QObject(parent)
{
setTitle(title);
}
QString MyObject::getTitle() const
{
return title;
}
void MyObject::setTitle(const QString &value)
{
title = value;
}
int MyObject::getIndex() const
{
return index;
}
void MyObject::setIndex(const int &value)
{
index = value;
}
Main.cpp
#include <QCoreApplication>
#include "myobject.h"
#include <QList>
#include <QStringList>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// Create a list of objects
const QStringList names{"Kevin","Amy","Michelle","John"};
QList<MyObject> objects;
for (int i = 0; i < names.size(); i++) {
MyObject obj = new MyObject(names[i]);
// MyObject obj(names[i]);
obj.setIndex(i);
}
// Sort Alphabetically
std::sort(objects.begin(), objects.end(), [](const MyObject& a, const MyObject& b) -> bool { return a.getTitle() < b.getTitle(); });
// Then Sort By Index
std::sort(objects.begin(), objects.end(), [](const MyObject& a, const MyObject& b) -> bool { return a.getIndex() < b.getIndex(); });
// Print info
for (int i=0; i < objects.size(); i++) {
qDebug() << objects[i].getIndex();
qDebug() << objects[i].getTitle();
}
return a.exec();
}
答案 0 :(得分:1)
您的示例代码遇到许多问题,但是有足够的地方(我认为)可以查看您要执行的操作。
首先,所示代码实际上并未向MyObject
变量中添加任何QList<MyObject>
实例,并且-基于某些注释掉的代码-您已经遇到了最大的问题:{ {1}}是不可复制的。由于QObject
继承自MyObject
,这意味着诸如以下代码将根本无法编译...
QObject
对QList<MyObject> objects;
MyObject obj("title");
objects.append(obj);
的调用将产生一条错误消息,内容类似于...
使用已删除的功能‘MyObject :: MyObject(const MyObject&)
要实现所需的功能,您需要通过引用或指针存储objects.append(...)
实例。例如...
MyObject
请注意,以上要求您不再需要{em> you 在各种const QStringList names{"Kevin", "Amy", "Michelle", "John"};
QList<MyObject *> objects;
for (int i = 0; i < names.size(); i++) {
MyObject *obj = new MyObject(names[i]);
obj->setIndex(i);
objects.append(obj);
}
// Sort Alphabetically
std::sort(objects.begin(), objects.end(),
[](const MyObject *a, const MyObject *b) -> bool
{
return a->getTitle() < b->getTitle();
});
// Then Sort By Index
std::sort(objects.begin(), objects.end(),
[](const MyObject *a, const MyObject *b) -> bool
{
return a->getIndex() < b->getIndex();
});
// Print info
for (int i=0; i < objects.size(); i++) {
qDebug() << objects[i]->getIndex();
qDebug() << objects[i]->getTitle();
}
实例上调用delete
,而MyObject
析构函数不会这样做为你。
根据您的特定要求,您可能不希望使用原始指针,而是考虑使用QList
或std::unique_ptr
的可能性。这样一来,您就不必在内存管理上完全关注自己了。