2013-05-10 61 views
6

我一直在尋找這個幾個小時,無濟於事。基本上我有錯誤:以臨時地址[-fpermissive]

struct rectangle { 
    int x, y, w, h; 
}; 

rectangle player::RegionCoordinates() // Region Coord 
{ 
    rectangle temp; 
    temp.x = colRegion.x + coordinates.x; 
    temp.w = colRegion.w; 
    temp.y = colRegion.y + coordinates.y; 
    temp.h = colRegion.h; 

    return temp; 
} 

// Collision detect function 
bool IsCollision (rectangle * r1, rectangle * r2) 
{ 
    if (r1->x < r2->x + r2->w && 
     r1->x + r1->w > r2->x && 
     r1->y < r2->y + r2->h && 
     r1->y + r1->h > r2->y) 
     { 
      return true; 
     } 
    return false; 
} 

//blah blah main while loop 
if (IsCollision(&player1.RegionCoordinates(), &stick1.RegionCoordinates())) //ERROR 
{ 
    player1.score+=10; 
    stick1.x = rand() % 600+1; 
    stick1.y = rand() % 400+1; 
    play_sample(pickup,128,128,1000,false); 
} 

任何想法?我相信這是非常明顯的事情,但對於我來說,我無法弄清楚。

+2

RegionCaordinates()是什麼簽名? – Angew 2013-05-10 11:45:01

+0

大聲笑我做到了,我的不好 – 2013-05-10 11:53:31

回答

1

由於錯誤的類型你得到的,我必須承擔RegionCoordinates()是按值返回一個對象,從而導致臨時的創造,你正在服用的是臨時的地址。

運算符的地址需要左值作爲它的操作數,但你把它應用到一個右值(臨時對象是右值)。

你可以這樣做(如果你不使用C++ 11,由RegionCoordinates返回的類型替換auto):

auto rcPlayer1 = player1.RegionCoordinates(); 
auto rcStick1 = player1.RegionCoordinates(); 
if (IsCollision(&rcPlayer1, &rcStick1)) //ERROR 
{ 
    player1.score+=10; 
    stick1.x = rand() % 600+1; 
    stick1.y = rand() % 400+1; 
    play_sample(pickup,128,128,1000,false); 
} 

或者,你可以改變IsCollision,使其接受引用而比指針,as suggested by Angew in his answer

3

由於IsCollision需要rectangle *和你在這裏取結果的地址:

if (IsCollision(&player1.RegionCoordinates(), &stick1.RegionCoordinates())) 

你最有可能被返回rectangleRegionCoordinates()這是一個臨時變量,因爲它會在if聲明後消失回來已經完成了。如果您的RegionCoordinates()結果賦值給一個變量,然後就不再是暫時的,那麼你可以利用它的地址:

rectangle r1 = player1.RegionCoordinates() ; 
rectangle r2 = stick1.RegionCoordinates() ; 
if (IsCollision(&r1, &r2)) 

或者你可以採取的參數const引用這將是更多的C++這樣做的方式:

bool IsCollision (const rectangle &r1, const rectangle &r2) 
10

RegionCoordinates()按值返回一個對象。這意味着致電RegionCoordinates()會返回rectangle的臨時實例。正如錯誤所述,您正在嘗試獲取此臨時對象的地址,這在C++中不合法。

爲什麼IsCollision()反正呢?通過const引用來獲取其參數會更自然:

bool IsCollision (const rectangle &r1, const rectangle &r2) { 
if (r1.x < r2.x + r2.w && 
    r1.x + r1.w > r2.x && 
    r1.y < r2.y + r2.h && 
    r1.y + r1.h > r2.y) { 
     return true; 
    } 
     return false; 
} 
//blah blah main while loop 
if (IsCollision(player1.RegionCoordinates(), stick1.RegionCoordinates())) //no error any more 
{ 
player1.score+=10; 
stick1.x = rand() % 600+1; 
stick1.y = rand() % 400+1; 
play_sample(pickup,128,128,1000,false); 
}