二维数组Qt,初始化及使用

Posted

技术标签:

【中文标题】二维数组Qt,初始化及使用【英文标题】:Two dimensional array Qt, initialization and usage 【发布时间】:2014-05-12 20:19:11 【问题描述】:

也许我只是累了,我想得不够清楚,或者我是 Qt 编程的菜鸟,但我在初始化和使用二维数组时遇到了问题。

我创建了如下所示的 OutputData 类:

#ifndef OUTPUTDATA_H
#define OUTPUTDATA_H

#include <QObject>
#include "algorithms/data/tabledata.h"
#include <QVector>
#include <QDebug>
class OutputData : public QObject

    Q_OBJECT
    Q_ENUMS(direction)
public:
    explicit OutputData(const int xSize, const int ySize, QObject *parent = 0);
    enum direction left, front, right, back ;
    double rightDistance;
    double leftDistance;
    double frontDistance;
    int xShift;
    int yShift;
    direction currentDir;
    int  turnCount;
    int  currentDirection;
    TableData** table;
    QString toString();
    void saveFieldInfo();
signals:

public slots:

private:

;

#endif // OUTPUTDATA_H

当然还有 cpp 文件:

#include "outputdata.h"

OutputData::OutputData(const int xSize,const  int ySize, QObject *parent) :
    QObject(parent)

    // Nie chce mi sie bawić z ujemnymi wartościami to zaczynam od 2996 skrętu w prawo.
    //Jak kiedyś robot skręci 2996 razy pod rząd w lewo to się będę tym przejmował
    currentDir=front;
    currentDirection = 2996;

    rightDistance =0;
    leftDistance = 0;
    frontDistance = 0;
    xShift =0;
    yShift =0;
    turnCount =0;

    //   vector = new QVector<QVector<TableData*> >(10, QVector<TableData*>(10));
    table =new TableData*[ySize];
    for(int i = 0; i < ySize; i++)
        table[i] = new TableData[xSize];
    
    for(int i = 0; i < ySize; i++)
        for(int j = 0; j < xSize; j++)
            table[i][j] = TableData();
        
    





void OutputData::saveFieldInfo()
    qDebug() << "save field info " << "rightDistance " << rightDistance <<  " leftDistance" << leftDistance << " frontDistance " << frontDistance
             << " currentDirection " << currentDirection;
    table[yShift][xShift].fillWithData(rightDistance,leftDistance,frontDistance,currentDirection);



QString OutputData::toString()
    QString* string = new QString("\"rightDistance\": \"\"");
    string ->append(",\"leftDistance\": \"\"");
    string->append(",\"frontDistance\": \"\"");
    string->append(",\"xShift\": \"\"");
    string->append(",\"yShift\": \"\"");
    string->append(",\"currentDir\": \"\"");
    string->append(",\"turnCount\": \"\"");
    string->append(",\"currentDirection\": \"\"");
    return *string;

TableData 类是原始值(如方向、距离等)的简单持有者。没什么特别的。

这是我的问题:我想要一个二维数组TableData,我可以在其中保存可以随机顺序提供但始终具有正确坐标的数据。 (希望这是可以理解的)

当我尝试编译此代码时,我收到了我不理解的错误。

/home/adam/Qt/5.2.1/gcc_64/include/QtCore/qglobal.h:979: błąd: 'QObject& QObject::operator=(const QObject&)' 是私有的 类 &operator=(const Class &) Q_DECL_EQ_DELETE; ^

(此错误指向 TableData 文件中的 class TableData : public QObject 行)

第二个:

/home/adam/Dropbox/workspace/git/qt/Raspberry/Raspberry/algorithms/data/tabledata.h:7: błąd:在此上下文类 TableData 中:公共 QObject ^

(此错误指向 qglobal.h 的第 979 行)

所以我认为(更好:我很确定)我做错了什么。但我真的不知道是什么!

有没有更好的方法来处理二维数组?如何初始化和使用它?我知道网络上有很多示例,但其中大多数使用 doubleint,我想使用我的课程 TableData。他们还在特定函数中制作了这个数组,我希望这个数组在整个班级都可用。

======= 编辑 正如建议的那样,我决定使用 QVector,但是当我尝试初始化它时,我收到了这个错误:

/home/adam/Dropbox/workspace2013.02/magisterka/git/qt/Raspberry/Raspberry/algorithms/data/outputdata.cpp:18: błąd: 'operator=' 不匹配(操作数类型为 'QVector >' 和 'QVector >*') 表 = 新 QVector >(10, QVector(10)); ^

在 outputdata.h 中

 QVector<QVector<TableData*> > table;

在 outputdata.cpp 中

  table = new QVector<QVector<TableData*> >(10, QVector<TableData*>(10));

此行会产生错误。如何解决?

以后如果我想使用这个表,这个表的字段是否会被初始化?

这合法吗:

table[x][y].method();

或者我应该这样做:

if(table[x][y] ==NULL)
 table[x][y] = new TableData();

    table[x][y].method();

对不起java风格:(

【问题讨论】:

【参考方案1】:

您的TableData 类是QObject 的子类,因此无法复制或复制分配。这就是您收到编译错误的原因。

您的数组应该使用指向TableData 实例的指针,即使用new 创建您的TableData 实例。你的table 声明应该是

TableData*** table;

与其使用内置数组,但使用容器可能会更好。我注意到您有一行注释掉了,它使用了TableData* 的 QVector 的 QVector,所以我不确定您是否尝试将容器方法移植到内置数组。除非您有充分的理由不这样做,否则最好坚持使用容器。


为了回答您的编辑,我认为您对 Java 和 C++ 感到困惑。在 C++ 中,您只需要 new 来进行动态内存分配。它返回一个指针。您的 table 变量已经被声明为 QVector 而不是指向变量的指针,因此在您实例化类时将设置它的存储。您需要做的只是类似

OutputData::OutputData(const int xSize,const  int ySize, QObject *parent) :
    QObject(parent),
    table(ySize) // resize to ySize (empty) rows

    for(int i = 0; i < ySize; i++)
        QVector<TableData*>& row = table[i];
        row.resize(xSize); // Each TableData pointer will be initialised to NULL
        for(int j = 0; j < xSize; j++)
            row[j] = new TableData();
        
    
    // ...

只有TableData 本身需要分配new。由于TableData 元素是指针,因此您需要像访问它们一样

table[x][y]->method();

【讨论】:

另一种选择是不派生自QObject,因为此类似乎没有任何理由这样做。 感谢您的回答我决定使用 QVector。但我遇到了另一个奇怪的问题。请检查已编辑的问题。【参考方案2】:
  QVector<QStringList> matrix"foo", "bar", "baz", "hello", "world", "!";
  qDebug() << "output: " << matrix[0];

将输出:

输出:("foo", "bar", "baz")

【讨论】:

以上是关于二维数组Qt,初始化及使用的主要内容,如果未能解决你的问题,请参考以下文章

C 语言二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )

C++ 一维数组及二维数组的特征和用法

数组 两种初始化方式及二维数组

Java.二维及多维

verilog 二维数组是如何初始化的啊?

如何在 Qt 中声明和使用二维整数数组(GUI)?