2013-05-10 131 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); 
}