C++ 二维数组Qt、初始化和使用

C++ 二维数组Qt、初始化和使用,c++,arrays,qt,C++,Arrays,Qt,也许我只是太累了,我想的不够清楚,也许我是个Qt编程高手,但我在初始化和使用二维数组时遇到了问题 我创建了OutputData类,如下所示: #ifndef OUTPUTDATA_H #define OUTPUTDATA_H #include <QObject> #include "algorithms/data/tabledata.h" #include <QVector> #include <QDebug> class OutputData : publ

也许我只是太累了,我想的不够清楚,也许我是个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
if(table[x][y] ==NULL){
 table[x][y] = new TableData();
}
    table[x][y].method();
在outputdata.cpp中

  table = new QVector<QVector<TableData*> >(10, QVector<TableData*>(10));
或者我应该这样做:

#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
if(table[x][y] ==NULL){
 table[x][y] = new TableData();
}
    table[x][y].method();

很抱歉使用java样式:(

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

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

TableData*** table;
与其使用内置数组,不如使用容器。我注意到有一行注释掉了,它使用的是
TableData*
的QVectors的QVectors,因此我不确定您是否尝试将容器方法移植到内置数组。除非您有有充分的理由不这样做


<> P> >回答你的编辑,我认为你在java和C++之间变得混淆了。C++中,你只需要<代码>新< /Cord>进行动态内存分配。它返回一个指针。你的<代码>表< /C>变量已经被声明为<代码> 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
类是
QObject
的子类,因此无法复制或复制分配。这就是为什么会出现编译错误

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

TableData*** table;
与其使用内置数组,不如使用容器。我注意到有一行注释掉了,它使用的是
TableData*
的QVectors的QVectors,因此我不确定您是否尝试将容器方法移植到内置数组。除非您有有充分的理由不这样做


<> P> >回答你的编辑,我认为你在java和C++之间变得混淆了。C++中,你只需要<代码>新< /Cord>进行动态内存分配。它返回一个指针。你的<代码>表< /C>变量已经被声明为<代码> 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();
        }
    }
    // ...
QVector矩阵{{“foo”、“bar”、“baz”}、{“hello”、“world”、“!”};
qDebug()
QVector矩阵{{{“foo”,“bar”,“baz”},{“hello”,“world”,“!”};

qDebug()另一个选项是不从
QObject
派生,因为这个类似乎没有任何理由这样做。谢谢你的回答,我决定使用QVector。但我遇到了另一个奇怪的问题。请检查编辑的问题。另一个选项是不从
QObject
派生,因为似乎没有任何原因关于本课程,谢谢你们的回答。我决定使用QVector。但我遇到了另一个奇怪的问题。请检查编辑的问题。
  QVector<QStringList> matrix{{"foo", "bar", "baz"}, {"hello", "world", "!"}};
  qDebug() << "output: " << matrix[0];