这是我的班级:
// file .h
#ifndef UNDOREDO_H
#define UNDOREDO_H
#include <QUndoCommand>
typedef QVector<QStringList> vector_t ;
class UndoRedo : public QUndoCommand
{
public:
UndoRedo(QList<vector_t> v,
QUndoCommand *parent = 0);
void undo();
private:
QList<vector_t> *cb_values;
};
#endif // UNDOREDO_H
// file .cpp
#include "undoredo.h"
UndoRedo::UndoRedo(QList<vector_t> v,
QUndoCommand *parent)
: QUndoCommand(parent)
{
cb_values = &v;
}
void UndoRedo::undo() {
QString last = cb_values[0][0].takeLast();
qDebug() << last << "removed!";
}
当我调用undo()方法时,IDE会引发此错误:
错误:从&#39; QStringList&#39;转换到非标量类型&#39; QString&#39;请求的
我在哪里做错了?
答案 0 :(得分:2)
在构造函数中,您将获取在构造函数返回时将消失的参数的地址:
cb_values = &v;
这一行会编译,但这是荒谬的。一旦构造函数返回,存储在cb_values
中的指针就会悬空,它的进一步使用可能会导致你的硬盘被格式化。
让我们分解cb_values[0][0].takeLast()
。
QList<vector_t> * cb_values
QList<vector_t> cb_values[0]
QVector<QStringList>=vector_t cb_values[0][0]
QStringList cb_values[0][0].takeLast()
因此,您的表达式类型为QStringList
,但您尝试将其分配给QString
。我不知道你真正想要实现的目标。也许是(*cb_values)[0][0].takeLast()
?
答案 1 :(得分:1)
cb_values
是指向QList<vector_t>
的指针,因此cb_values[0]
为QList<vector_t>
。因此cb_values[0]
为vector_t
或QVector<QStringList>
。然后,您在此向量上调用takeLast()
,然后返回QStringList
,您尝试将其分配给QString
。在我看来,你正在调用takeLast()
而不是你想要的对象。