我正在尝试创建一个二维指针类数组。因为我需要一个类对象的网格。 现在我收到的错误是:
testApp.cpp | 53 |错误:'((testApp *)this'中的'operator []'不匹配 - > testApp :: myCell [i]'|
// this is cell.h
class Cell
{
public:
int x;
};
// this is testApp.h
class testApp : public ofBaseApp{
public:
int width;
int height;
int Grid;
int space;
float wWidth;
float wHeight;
Cell myCell;
void setup();
void update();
void draw();
};
“。 //这是testapp.cpp //这是错误的地方
void testApp::setup(){
Cell *myCell[5][5];
myCell[1][0]->x =2;
myCell[2][0]->x =1;
myCell[3][0]->x =23;
myCell[4][0]->x =4;
myCell[5][0]->x =7;
myCell[0][0]->x =4;
}
//--------------------------------------------------------------
void testApp::draw(){
ofSetColor(255,255,0);
for (int i = 0; i<5; i++) {
int q = myCell[i][0]->x; // i get the error here.
ofCircle(20*q,20*q,50);
}
}
我不明白为什么在使用myCell指针和x参数时出现问题。
非常感谢任何帮助。
答案 0 :(得分:2)
您有两个名为myCell
的对象。第一个是testApp
的成员Cell
:
class testApp : public ofBaseApp {
public:
// ...
Cell myCell;
// ...
}
名为myCell
的其他对象是在testApp::setup()
函数中创建的,类型为array of 5 array of 5 pointer to Cell
。
void testApp::setup() {
Cell *myCell[5][5]; // This hides the previous myCell
// ...
}
在setup()
函数中,您隐藏了成员myCell
。当函数结束时,myCell
的数组版本超出范围,不再存在。首先,您要修复成员myCell
的定义:
class testApp : public ofBaseApp {
public:
// ...
Cell* myCell[5][5];
// ...
}
并删除myCell
中的setup()
的定义:
void testApp::setup() {
// ...
}
您现在只有一个名为myCell
的对象,它是指向myCell
的2D数组。但现在我们还有另一个问题需要解决。你有这个指针数组,但它们目前没有指向任何地方 - 它们是未初始化。您不能只尝试myCell[1][0]->x
,因为索引Cell
没有指向[1][0]
个对象。
解决这个问题的一种方法是循环遍历整个数组,使用new
为所有Cell
动态分配空间。你可以这样做:
void testApp::setup() {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
myCell[i][j] = new Cell();
}
}
// ...
}
然而,更好的方法是根本不使用动态分配(new
)。如果您只是将myCell
定义为Cells
的数组,而不是指向Cell
的数组,则Cell
将自动分配到堆栈中。这涉及将成员定义更改为:
class testApp : public ofBaseApp {
public:
// ...
Cell myCell[5][5];
// ...
}
现在,当您创建testApp
实例时,将自动分配该数组。现在您可以按如下方式设置数组的内容:
void testApp::setup() {
myCell[1][0].x = 2;
myCell[2][0].x = 1;
// ...
}
答案 1 :(得分:1)
您似乎试图在myCell
中引用testApp::setup()
中的testApp::draw()
,但您只能访问testApp::myCell
的成员Cell
,其类型为{{ 1}}因此不支持您想要的操作。
修改强>
您提到的崩溃的一个可能来源可能是您的setup()
功能。
你在那里使用单位指针。根据您在评论中提到的更改,您还应将设置中的代码更改为:
void testApp::setup(){
//remove the next line to not shadow the member declaration
//Cell *myCell[5][5];
//replace -> by . as you are not handling pointers anymore
myCell[1][0].x =2;
myCell[2][0].x =1;
myCell[3][0].x =23;
myCell[4][0].x =4;
myCell[5][0].x =7;
myCell[0][0].x =4;
}
答案 2 :(得分:0)
您的变量myCell
仅在testApp::setup
的范围内定义。因此,您无法在testApp::draw
范围内访问它。考虑将其作为testApp
类的属性。