2013-07-06 90 views
0

我已經以下所示的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); 
      } 
     } 
    } 
} 
+0

調用'GetWidth'的代碼在哪裏? –

+0

爲什麼你的獲得者需要一個參數並返回一個值?這是多餘的...... – Borgleader

+0

@MatsPetersson我想用OpenGL做俄羅斯方塊重製,所以我有一個'display'方法調用'draw'方法,使用它的寬度繪製'Rectangle'。 – Greg

回答

0

我上線得到一個EXC_BAD_ACCESS錯誤[...]。爲什麼我不能再讀這個變量?我也遇到了與_height變量相同的問題。 [之後...]我曾經嘗試都float pieceWidth; obj->getWidth(&pieceWidth);obj->getWidth(new float) - 實際的錯誤是在哪裏我讀_width行,之前我甚至使用指針傳遞。 [稍後...]我將getWidth和getHeight方法修改爲僅返回_width和_height。現在我只是在返回_width時出錯;

在這種情況下,我看你使用的是Rectangle*指針作爲obj->getWidth能以及導致壞訪問錯誤,如果obj是不是一個有效的指針。


這是要注意,我不完全理解你的getter方法。它簡化(並可能標準)版本可能是:

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

有了,當你使用的唯一區別是:

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

,你現在可以做的:

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

這可能更清潔,肯定不會導致這樣的錯誤。一個好的經驗法則是,儘可能不要使用指針。如果您需要修改函數中的變量,請使用引用。

+0

好吧,我修改了'getWidth'和'getHeight'方法,只是簡單地返回'_width'和'_height'。現在我只是在'return _width;'上得到一個錯誤。 – Greg

+0

@Greg,這意味着你的'obj'不是'Rectangle *'的有效指針。如果你向我展示從你聲明'obj'到你調用'obj-> getWidth'的地方的代碼,我可能會發現問題出現在哪裏。 – Shoe

+0

我已將此代碼添加到原始帖子。 – Greg

相關問題