2013-05-10 17 views
6

Ich habe dies für ein paar Stunden, vergeblich untersucht. Grundsätzlich habe ichFehler: Adresse der temporären [-fürmissiv]

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

Irgendwelche Ideen? Ich bin mir sicher, dass es etwas ganz Offensichtliches ist, aber für das Leben von mir kann ich es nicht herausfinden.

+2

Was ist die Signatur von 'RegionCoordinates()'? – Angew

+0

lol ich tat, mein schlechtes –

Antwort

1

die Art von Fehler Angenommen, Sie bekommen, muss ich davon ausgehen, RegionCoordinates() ist ein Objekt nach Wert zurückkehrt, wodurch die Schaffung eines temporären, und Sie die Adresse dieses vorübergehende Einnahme.

Der Adressoperator ein lvalue als Operanden erfordert, aber Sie sind Anwendung auf einem rvalue (Provisorien sind rvalues ​​).

Sie dies tun könnten (wenn Sie nicht C++ 11 verwenden, ersetzen auto mit dem Typ zurück von 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); 
} 

Alternativ können Sie IsCollision so ändern, dass es Referenzen akzeptiert eher als Zeiger, as suggested by Angew in his answer.

3

Seit IsCollision nimmt eine rectangle * und Sie nehmen die Adresse des Ergebnisses hier:

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

Sie höchstwahrscheinlich eine rectangle zurück von RegionCoordinates() zurückkehren, die eine temporäre Variable ist, da sie nach der if Anweisung verschwinden erledigt. Wenn Sie das Ergebnis von RegionCoordinates() einer Variablen zuweisen, dann wird es nicht mehr zeitlich begrenzt sein und Sie können dann die Adresse davon nehmen:

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

Alternativ können Sie die Parameter wie const Referenzen nehmen, die die mehr C wäre ++ Vorgehensweise:

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

RegionCoordinates() gibt ein Objekt nach Wert zurück. Dies bedeutet, dass ein Aufruf an RegionCoordinates() eine temporäre Instanz von rectangle zurückgibt. Wie der Fehler sagt, versuchen Sie, die Adresse dieses temporären Objekts zu übernehmen, was in C++ nicht zulässig ist.

Warum nimmt IsCollision() sowieso Zeiger? Es wäre natürlicher, seine Parameter durch const Referenz zu nehmen:

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