Ошибка массива классов указателей c ++ 2 (с openframeworks)

я пытаюсь создать массив двухмерного указателя класса. Потому что мне нужна сетка объектов класса.
Прямо сейчас я получаю сообщение об ошибке:

testApp.cpp | 53 | ошибка: нет совпадения для ‘operator []’ в ‘((testApp *) this) -> 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.

Любая помощь с благодарностью.

-1

Решение

У вас есть два объекта с именем 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, Но теперь нам нужно решить еще одну проблему. У вас есть этот массив указателей, но они в настоящее время никуда не указывают — они неинициализированным. Вы не можете просто попытаться сделать myCell[1][0]->x потому что нет Cell объект, на который указывает указатель [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;
// ...
}
2

Другие решения

Кажется, вы пытаетесь обратиться к myCell от testApp::setup() в 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;
}
1

Ваша переменная myCell определяется только в рамках testApp::setup, Таким образом, вы не можете получить к нему доступ в рамках testApp::draw, Подумайте о том, чтобы сделать это атрибутом вашего testApp учебный класс.

0
По вопросам рекламы [email protected]