2013-05-10 31 views
6

Tôi đã xem xét điều này trong một vài giờ, không có kết quả. Về cơ bản tôi cóLỗi: lấy địa chỉ tạm thời [-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); 
} 

Bất kỳ ý tưởng nào? Tôi chắc chắn nó là một cái gì đó thực sự rõ ràng nhưng đối với cuộc sống của tôi tôi không thể tìm ra nó.

+2

Chữ ký của 'RegionCoordinates() 'là gì? – Angew

+0

lol Tôi đã làm, xấu của tôi –

Trả lời

1

Do loại lỗi bạn đang nhận được, tôi phải giả định RegionCoordinates() trả về một đối tượng theo giá trị, do đó tạo ra một tạm thời và bạn đang sử dụng địa chỉ tạm thời đó.

Địa chỉ-của nhà điều hành yêu cầu một vế trái như toán hạng của nó, nhưng bạn đang áp dụng nó vào một rvalue (temporaries là rvalues ​​).

Bạn có thể làm điều này (nếu bạn không sử dụng C++ 11, thay thế auto với kiểu trả về bởi 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); 
} 

Ngoài ra, bạn có thể thay đổi IsCollision để nó chấp nhận tài liệu tham khảo thay so với con trỏ, as suggested by Angew in his answer.

3

Kể từ IsCollision mất một rectangle * và bạn đang dùng địa chỉ của kết quả ở đây:

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

Bạn rất có thể được trả lại một rectangle trở lại từ RegionCoordinates() mà là một biến tạm thời vì nó sẽ biến mất sau khi tuyên bố if hoan thanh. Nếu bạn gán kết quả của RegionCoordinates() cho một biến thì nó sẽ không còn là một tạm thời và sau đó bạn có thể lấy địa chỉ của nó:

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

Hoặc bạn có thể lấy các thông số như tài liệu tham khảo const đó sẽ là C hơn ++ cách thực hiện:

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

RegionCoordinates() trả về một đối tượng theo giá trị. Điều này có nghĩa là một cuộc gọi đến số RegionCoordinates() sẽ trả lại phiên bản tạm thời là rectangle. Khi lỗi nói, bạn đang cố gắng lấy địa chỉ của đối tượng tạm thời này, điều này không hợp pháp trong C++.

Tại sao IsCollision() vẫn lấy con trỏ? Sẽ mất nhiều tham số hơn khi tham chiếu 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); 
} 
Các vấn đề liên quan