我已經以下所示的Rectangle
類:爲什麼在讀回私有類變量時會得到EXC_BAD_ACCESS?
部首:
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
閱讀它的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);
}
}
}
}
調用'GetWidth'的代碼在哪裏? –
爲什麼你的獲得者需要一個參數並返回一個值?這是多餘的...... – Borgleader
@MatsPetersson我想用OpenGL做俄羅斯方塊重製,所以我有一個'display'方法調用'draw'方法,使用它的寬度繪製'Rectangle'。 – Greg