错误:获取临时[-fpermissive]的地址

时间:2013-05-10 11:44:19

标签: c++ collision-detection collision allegro

我一直在研究这几个小时,但没有用。基本上我有

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);
}

有什么想法吗?我确定这是非常明显的事情,但对于我的生活,我无法弄清楚。

3 个答案:

答案 0 :(得分:15)

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);
}

答案 1 :(得分:4)

由于IsCollision需要rectangle *而您在此处获取结果的地址:

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

您最有可能从rectangle返回RegionCoordinates()这是一个临时变量,因为它会在if语句完成后消失。如果您将RegionCoordinates()的结果分配给变量,那么它将不再是临时变量,然后您可以获取它的地址:

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

或者你可以将参数作为const引用,这将是更多的C ++方式:

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

答案 2 :(得分:1)

鉴于您遇到的错误,我必须假设RegionCoordinates()按值返回一个对象,从而导致创建临时,并且您正在获取该地址临时。

address-of运算符需要左值作为其操作数,但是您将它应用于 rvalue (临时值为 rvalues )。

你可以这样做(如果你没有使用C ++ 11,用auto返回的类型替换RegionCoordinates):

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