gpt4 book ai didi

c++ - 二维数组Qt,初始化和使用

转载 作者:行者123 更新时间:2023-11-28 02:48:28 26 4
gpt4 key购买 nike

也许我只是累了,我想得不够清楚,或者我是 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&)' is private Class &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: within this context class TableData : public QObject ^

(这个错误指向qglobal.h的979行)

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

有没有更好的方法来处理二维数组?如何初始化和使用呢?我知道网上有很多示例,但大多数示例使用 doubleint,我想使用我的类 TableData。他们还在特定功能中制作了这个数组,我希望整个类(class)都可以使用这个数组。

======= 编辑按照建议我决定使用 QVector 但是当我尝试初始化它时我得到了这个错误:

/home/adam/Dropbox/workspace2013.02/magisterka/git/qt/Raspberry/Raspberry/algorithms/data/outputdata.cpp:18: błąd: no match for 'operator=' (operand types are 'QVector >' and 'QVector >*') table = new QVector >(10, QVector(10)); ^

在输出数据.h中

 QVector<QVector<TableData*> > table;

在输出数据.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 风格:(

最佳答案

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

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

TableData*** table;

尽管使用容器可能会更好,但不要使用内置数组。我注意到您注释掉了一行,该行使用 TableData* 的 QVectors 的 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();

关于c++ - 二维数组Qt,初始化和使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23618109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com