(C++ QT) QList 只允许附加常量类对象?

Posted

技术标签:

【中文标题】(C++ QT) QList 只允许附加常量类对象?【英文标题】:(C++ QT) QList only allows appending constant class objects? 【发布时间】:2010-01-07 22:32:51 【问题描述】:

我对 QT 很陌生。我已经搞砸了一个星期了。我在尝试向 Qlist 添加自定义数据类型时遇到错误

QObject parent;

QList<MyInt*> myintarray;

myintarray.append(new const MyInt(1,"intvar1",&parent));
myintarray.append(new const MyInt(2,"intvar2",&parent));
myintarray.append(new const MyInt(3,"intvar3",&parent));

我的 MyInt 类是一个简单的 int 包装器,看起来像这样

#ifndef MYINT_H
#define MYINT_H

#include <QString>
#include <QObject>

class MyInt : public QObject
 
 Q_OBJECT

 public:

MyInt(const QString name=0, QObject *parent = 0);
MyInt(const int &value,const QString name=0, QObject *parent = 0);
MyInt(const MyInt &value,const QString name=0,QObject *parent = 0);
int getInt() const;

public slots:
void setInt(const int &value);
void setInt(const MyInt &value);

signals:
 void valueChanged(const int newValue);

private:
int intStore;

;

#endif

我在 Qlist 附加期间遇到的错误

错误:从 'const 进行的无效转换 MyInt*' 到 'MyInt*' 错误: 初始化 'void 的参数 1 QList::append(const T&) [with T = MyInt*]'

如果有人能指出我做错了什么,那就太棒了。

【问题讨论】:

【参考方案1】:

所以你创建了一个列表:

QList&lt;MyInt*&gt; myintarray;

然后你稍后尝试追加

myintarray.append(new const MyInt(1,"intvar1",&parent));

问题是 new const MyInt 正在创建一个 const MyInt *,您不能将它分配给 MyInt *,因为它失去了 const 性。

你要么需要改变你的 QList 来保存 const MyInts 像这样:

QList&lt;const MyInt*&gt; myintarray;

或者您不需要通过将追加更改为来创建 const MyInt *:

myintarray.append(new MyInt(1,"intvar1",&parent));

您将选择的方法将取决于您希望如何使用 QList。如果您不想更改 MyInt 中的数据,则只需要 const MyInt *

【讨论】:

【参考方案2】:

你需要使用:

   QList<const MyInt*> myintarray;

【讨论】:

要说你不想保存 const 指针,因为你会泄漏(由于 delete 无法处理它们)。但我查了一下,令我惊讶的是,你确实可以删除一个 const 指针。不知道我是否喜欢它,但是……我猜每天都会学到一些新东西! 好的,如果我这样做了,那么那个对象会是可变的吗?我想遍历该列表并编辑一些值,但这不可能,因为这将丢弃“const”限定符。有什么建议吗?【参考方案3】:

编译器会告诉您现在需要做的一切 - 您正在尝试将 const T* 存储为 T* 并且不允许从 const T*T* 的隐式转换。 在append()ing 时省略const

【讨论】:

【参考方案4】:

我会说你应该只是将一个常规的 MyInt* 传递给 QList::append。 “const T&”指的是指针类型——QList 承诺不会重新分配您提供的指针。

【讨论】:

以上是关于(C++ QT) QList 只允许附加常量类对象?的主要内容,如果未能解决你的问题,请参考以下文章

常量类成员、赋值运算符和 QList

Qt QList C3892:无法分配给常量变量

Qt - 我自己的自定义对象的 QListView

Qt容器类的对象模型及应用(线性结构篇:对于QList来说,sharable默认是false的,但对于接下来讲的QVector来说,sharable默认是true)

Qt学习总结(C鱼)之QList和QMap容器类

Qlist 适合在服务中使用吗?