Почему я получаю EXC_BAD_ACCESS при чтении закрытой переменной класса?

у меня есть Rectangle класс показан ниже:

Заголовок:

class Rectangle: public Polygon {
private:
float _width, _height;
public:
Rectangle(float width, float height);
float getWidth(float* width) const;
float getHeight(float* height) const;
bool isCollidingWith(Rectangle* other) const;
};

Выбранная реализация:

Rectangle::Rectangle(float width, float height) : Polygon(explodeRect(width, height, new struct vertex[4]), 4) {
printf("creating rect %f x %f\n", width, height);
_width = width;
_height = height;
printf("set _width to %f\n", _width);
}

float Rectangle::getWidth(float* width) const {
printf("_w: %f\n", _width);
*width = _width;
return *width;
//return (*width = _width);
}

float Rectangle::getHeight(float* height) const {
return (*height = _height);
}

Я инициализирую экземпляр Rectangle класс, и вывод указывает, что _width переменная назначается правильно. Однако, когда я позже попытаюсь прочитать переменную, используя getWidth метод, я получаю EXC_BAD_ACCESS ошибка на линии:

printf("_w: %f\n", _width);

Почему я больше не могу читать эту переменную? У меня та же проблема с _height переменная, а также.

РЕДАКТИРОВАТЬ: Я также хотел бы отметить, что, если я пропускаю чтение ширины, я получаю ошибку, пытаясь прочитать публичные переменные непосредственно из объекта, например. когда я пытаюсь прочитать его положение х с obj->x,

РЕДАКТИРОВАТЬ 2: Может ли это быть из-за того, что объект является экземпляром подкласса Rectangleи этот подкласс определен в другом файле, чем Rectangle является? Я также читаю значения из третьего файла.

РЕДАКТИРОВАТЬ 3: больше кода ниже.

Я пытаюсь воссоздать тетрис с OpenGL. В моем display Метод, у меня есть этот код для рисования прямоугольников:

if(fallingBlock != nullptr) {
printf("drawing falling block at (%f, %f)\n", fallingBlock->x, fallingBlock->y);
draw(fallingBlock);
}

fallingBlock определяется как глобальная переменная в верхней части моего файла:

Block* fallingBlock;

От моего mainЯ называю initVars метод, который впоследствии вызывает startDroppingBlock метод. Вот:

void startDroppingBlock() {
Block* block = availableBlocks[random() % numAvailableBlocks].copy();
block->x = 0.5;
block->y = SCREEN_TOP;
block->dy = -0.01f;
//printf("copied block is at (%f, %f)\n", block->x, block->y);
fallingBlock = block;
}

А вот мой метод рисования блоков:

void draw(Block* obj) {
bool shape[3][3];
obj->getShape(shape);
//printf("got shape: {%d, %d, %d}, {%d, %d, %d}, {%d, %d, %d}\n", shape[0][0], shape[0][1], shape[0][2], shape[1][0], shape[1][1], shape[1][2], shape[2][0], shape[2][1], shape[2][2]);
/*float pieceWidth;
obj->getWidth(&pieceWidth);
pieceWidth /= 3.0f;*/
float pieceWidth = obj->getWidth();
for(unsigned int i=0; i<3; i++) {
for(unsigned int j=0; j<3; j++) {
if(shape[i][j]) {
Square rect = Square(pieceWidth);
rect.x = obj->x + pieceWidth * j;
rect.y = obj->y + pieceWidth * i;
rect.color = obj->color;
draw(&rect);
}
}
}
}

0

Решение

Я получаю ошибку EXC_BAD_ACCESS на линии […]. Почему я больше не могу читать эту переменную? У меня та же проблема с переменной _height. [позже …] Я попробовал оба float pieceWidth; obj->getWidth(&pieceWidth); а также obj->getWidth(new float) — фактическая ошибка находится на линии, где я читаю _width, прежде чем я даже использовать переданный в указатель. [позже …] Я изменил методы getWidth и getHeight, чтобы просто возвращать _width и _height. Теперь я просто получаю ошибку при возврате _width;

В этом случае я вижу, что вы используете Rectangle* указатель как obj->getWidth что может привести к ошибке доступа, если obj неверный указатель


Следует отметить, что я не совсем понимаю ваш метод получения. Упрощенный (и, возможно, стандарт) версия может быть:

float Rectangle::getWidth() const {
return _width;
}

С той лишь разницей, что при использовании:

// float a;
// float b;
a = rect.getWidth(&b);

Теперь вы можете сделать:

// float a;
// float b;
a = b = rect.getWidth();

что, возможно, чище и, безусловно, не вызовет такой ошибки. Хорошее практическое правило — никогда не использовать указатели, когда это возможно. Если вам нужно изменить переменную внутри функции, просто используйте ссылку.

0

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector