二维数组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 行)
所以我认为(更好:我很确定)我做错了什么。但我真的不知道是什么!
有没有更好的方法来处理二维数组?如何初始化和使用它?我知道网络上有很多示例,但其中大多数使用 double 或 int,我想使用我的课程 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,初始化及使用的主要内容,如果未能解决你的问题,请参考以下文章