2013-05-10 16 views
6

Ho esaminato questo per alcune ore, senza alcun risultato. Fondamentalmente hoErrore: prendere l'indirizzo di temporaneo [-fermissivo]

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

Qualche idea? Sono sicuro che sia qualcosa di veramente ovvio ma per la vita di me non riesco a capirlo.

+2

Qual è la firma di 'RegionCoordinates()'? – Angew

+0

lol l'ho fatto, mio ​​male –

risposta

1

Dato il tipo di errore che si stanno ottenendo, devo presumere RegionCoordinates() restituisce un oggetto per valore, provocando in tal modo la creazione di un temporanea, e si sta prendendo l'indirizzo di quella temporanea.

L'operatore di indirizzo richiede una lvalue come il suo operando, ma si sta applicando a un rvalue (provvisori sono rvalues ​​).

Si potrebbe fare questo (se non si utilizza C++ 11, sostituire auto con il tipo restituito da 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); 
} 

In alternativa, è possibile modificare IsCollision in modo che accetti riferimenti piuttosto di puntatori, as suggested by Angew in his answer.

3

Dal IsCollision prende un rectangle * e che sta assumendo l'indirizzo del risultato qui:

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

Molto probabilmente si restituisce un rectangle ritorno da RegionCoordinates() che è una variabile temporanea dato che scompare dopo la dichiarazione if è fatta. Se si assegna il risultato di RegionCoordinates() ad una variabile allora non sarà più una temporanea e quindi è possibile prendere l'indirizzo di esso:

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

In alternativa è possibile prendere i parametri come const riferimenti che sarebbe il più C++ modo di farlo:

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

RegionCoordinates() restituisce un oggetto in base al valore. Ciò significa che una chiamata a RegionCoordinates() restituisce un'istanza temporanea di rectangle. Come dice l'errore, stai cercando di prendere l'indirizzo di questo oggetto temporaneo, che non è legale in C++.

Perché lo strumento IsCollision() prende comunque dei puntatori? Sarebbe più naturale prendere i suoi parametri per riferimento 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); 
}