-1

这是我的课:

// 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 会引发此错误:

错误:请求从“QStringList”转换为非标量类型“QString”

我在哪里做错了?

4

2 回答 2

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()

于 2014-07-21T15:52:55.950 回答
1

cb_valuesis 指向QList<vector_t>so cb_values[0]is的指针QList<vector_t>。也是cb_values[0]vector_t或者QVector<QStringList>。然后你调用takeLast()这个向量,它返回QStringList,你尝试分配给QString。在我看来,您takeLast()不是在调用您想要的对象。

于 2014-07-21T15:49:18.497 回答