-1

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

testApp.cpp|53|错误:'((testApp*)this)->testApp::myCell[i]'中的'operator[]'不匹配|

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

任何帮助是极大的赞赏。

4

3 回答 3

2

您有两个名为 的对象myCell。第一个是testAppwith type的成员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()函数中,您隐藏了 member myCell。当函数结束时,数组版本的myCell超出范围并且不再存在。因此,首先,您要修复成员的定义myCell

class testApp : public ofBaseApp {
  public:
    // ...
    Cell* myCell[5][5];
    // ...
}

并删除myCellin的定义setup()

void testApp::setup() {
    // ...
}

您现在只有一个名为的对象myCell,它是一个指向myCell. 但是现在我们还有另一个问题要解决。你有这个指针数组,但它们当前没有指向任何地方——它们是uninitialized。您不能只是尝试这样做,myCell[1][0]->x因为Cell在 index 处没有指向对象[1][0]

解决此问题的一种方法是遍历整个数组,new用于为所有Cells 动态分配空间。你可以这样做:

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,则Cells 将自动分配到堆栈上。这涉及将成员定义更改为:

class testApp : public ofBaseApp {
  public:
    // ...
    Cell myCell[5][5];
    // ...
}

现在,当您testApp创建实例时,将自动分配数组。现在您可以按如下方式设置数组的内容:

void testApp::setup() {
    myCell[1][0].x = 2;
    myCell[2][0].x = 1;
    // ...
}
于 2012-10-06T11:49:34.517 回答
1

似乎您正在尝试引用myCellfrom testApp::setup()in testApp::draw(),但您只能访问testApp::myCell那里的成员,该成员属于类型Cell,因此不支持您想要的操作。

编辑

您提到的崩溃的一个可能来源可能是您的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;
}
于 2012-10-06T10:46:39.370 回答
0

您的变量myCell仅在testApp::setup. 因此,您无法在testApp::draw. 考虑让它成为你testApp班级的一个属性。

于 2012-10-06T10:58:43.947 回答