c ++ 2维指针类数组错误(使用openframeworks)

时间:2012-10-06 10:39:01

标签: c++ class multidimensional-array openframeworks

我正在尝试创建一个二维指针类数组。因为我需要一个类对象的网格。 现在我收到的错误是:

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参数时出现问题。

非常感谢任何帮助。

3 个答案:

答案 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类的属性。