(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<MyInt*> myintarray;
然后你稍后尝试追加
myintarray.append(new const MyInt(1,"intvar1",&parent));
问题是 new const MyInt 正在创建一个 const MyInt *,您不能将它分配给 MyInt *,因为它失去了 const 性。
你要么需要改变你的 QList 来保存 const MyInts 像这样:
QList<const MyInt*> 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 只允许附加常量类对象?的主要内容,如果未能解决你的问题,请参考以下文章
Qt容器类的对象模型及应用(线性结构篇:对于QList来说,sharable默认是false的,但对于接下来讲的QVector来说,sharable默认是true)