2012-06-08 38 views
9

Về cơ bản những gì tôi muốn làm là lưu trữ tham chiếu đến hoạt ảnh động của một sprite như một thành viên riêng tư trong lớp Actor. Tôi muốn sử dụng một tham chiếu vì vậy tôi không phải thực sự tạo ra các hình ảnh động nhiều lần nhưng tôi tiếp tục nhận được một lỗi.Thành viên tham chiếu Uninitialized

diễn viên khai báo lớp:

class Actor 
{ 
public: 
     Actor(); 
     ~Actor(); 
     void setActiveAnimation(Animation anim); 
     void draw(sf::RenderWindow& win); 

private: 
     sf::Sprite sprite; 
     MaJR::Animation& activeAnimation; 
}; 

thi lớp Diễn viên:

Actor::Actor() 
{ 
    // constructor 
} 

Actor::~Actor() 
{ 
    // destructor 
} 

void Actor::setActiveAnimation(Animation anim) 
{ 
    activeAnimation = anim; 
    activeAnimation.gotoStart(); 
} 

void Actor::draw(sf::RenderWindow& win) 
{ 
    sprite.setTexture(activeAnimation.getActiveFrame()); 
    win.draw(sprite); 
    activeAnimation.nextFrame(); 
} 

sản lượng xây dựng:

/home/mike/MaJR Game Engine/src/Actor.cpp||In constructor 'MaJR::Actor::Actor()':| 
/home/mike/MaJR Game Engine/src/Actor.cpp|8|error: uninitialized reference member 'MaJR::Actor::activeAnimation' [-fpermissive]| 
||=== Build finished: 1 errors, 0 warnings ===| 

Trả lời

18

Một tài liệu tham khảo không thể bố trí, vì vậy nó phải được khởi tạo tại thành viên -initialization-list. Tuy nhiên, bạn có ý định chỉ định lại nó để những gì bạn muốn không phải là một tham chiếu. Hơn nữa, trong hàm setActiveAnimation của bạn, bạn đang đặt tham chiếu như vậy thành một bản sao của giá trị được chuyển làm đối số, cho phép bạn tham chiếu không hợp lệ khi mã thoát khỏi hàm. Có lẽ một con trỏ sẽ phù hợp với bạn?

Trong cơ thể lớp:

MaJR::Animation* activeAnimation; 

setActiveAnimation chức năng:

void Actor::setActiveAnimation(Animation* anim) 
{ 
    activeAnimation = anim; 
    activeAnimation->gotoStart(); 
} 
+3

Phân tích của bạn là tốt, nhưng tôi không thể đưa ra câu trả lời bằng mã lưu trữ địa chỉ của tham số được chuyển qua tham chiếu. Nếu bạn đang lưu trữ một con trỏ để sử dụng sau này, hãy chấp nhận một tham số con trỏ, để làm cho người gọi nhận thức rõ hơn về những cân nhắc suốt đời. –

+0

@Ben Voigt: Tôi sẽ không biết, tôi không sử dụng _raw pointers_ trong mã của tôi cả. –

+1

Tôi đồng ý rằng con trỏ thô không tốt bằng con trỏ thông minh. Nhưng một tham chiếu là tồi tệ hơn nhiều. 1 để sửa chữa. –

1

Bạn cần phải ràng buộc một tham chiếu lúc định nghĩa. Đối với các tham chiếu thành viên, điều này có nghĩa là trong danh sách khởi tạo của hàm tạo. Hơn nữa ràng buộc không thể được gán lại sau khi khai báo.

Nếu bạn không có đối tượng (để tham khảo) tại thời điểm instatiation Actor đối tượng, đặt cược tốt nhất tiếp theo của bạn là sử dụng con trỏ có thể được gán lại sau khi cần thiết.

6

Khi bạn có một thành viên trong lớp của bạn là tham chiếu, bạn PHẢI khởi tạo nó trong hàm tạo. Một khi nó được khởi tạo, bạn không thể thay đổi nó nữa (bạn có thể thay đổi giá trị nhưng không thể thay đổi giá trị của nó).

Đặt hoạt độngHãy thay đổi con trỏ.

2

Bạn không thể khai báo tham chiếu chưa được khởi tạo. Điều đó có nghĩa là bạn cần khởi tạo tham chiếu khi tạo đối tượng từ lớp Actor hoặc bạn không thể sử dụng tham chiếu. Nếu bạn cần thay đổi động, bạn có thể sử dụng con trỏ hoặc, có thể tốt hơn, con trỏ thông minh (ví dụ: std::unique_ptr, shared_ptr). Nếu bạn không thể sử dụng C++ 11, thì hãy xem smart pointers từ Boost.

Các vấn đề liên quan