я пытаюсь создать массив двухмерного указателя класса. Потому что мне нужна сетка объектов класса.
Прямо сейчас я получаю сообщение об ошибке:
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.
Любая помощь с благодарностью.
У вас есть два объекта с именем 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
динамически распределять пространство для всех Cell
s. Вы бы сделали это следующим образом:
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
s будут размещены в стеке автоматически. Это включает изменение определения члена на:
class testApp : public ofBaseApp {
public:
// ...
Cell myCell[5][5];
// ...
}
Теперь, когда ваш testApp
экземпляр создан, массив будет выделен автоматически. Теперь вы можете настроить содержимое массива следующим образом:
void testApp::setup() {
myCell[1][0].x = 2;
myCell[2][0].x = 1;
// ...
}
Кажется, вы пытаетесь обратиться к 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;
}
Ваша переменная myCell
определяется только в рамках testApp::setup
, Таким образом, вы не можете получить к нему доступ в рамках testApp::draw
, Подумайте о том, чтобы сделать это атрибутом вашего testApp
учебный класс.