2012-06-08 19 views
9

असल में मैं जो करना चाहता हूं वह अभिनेता वर्ग में एक निजी सदस्य के रूप में एक स्प्राइट की सक्रिय एनीमेशन के संदर्भ को संग्रहीत करता है। मैं एक संदर्भ का उपयोग करना चाहता हूं इसलिए मुझे वास्तव में कई बार एनीमेशन बनाने की ज़रूरत नहीं है लेकिन मुझे एक त्रुटि मिल रही है।अनियंत्रित संदर्भ सदस्य

अभिनेता वर्ग घोषणा:

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

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

अभिनेता वर्ग कार्यान्वयन:

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

बिल्ड उत्पादन:

/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 ===| 

उत्तर

18

एक संदर्भ पुन: असाइन, तो यह कम से प्रारंभ किया जाना चाहिए नहीं किया जा सकता सदस्य - आरंभिकरण सूची। हालांकि, आप इसे पुन: असाइन करना चाहते हैं ताकि आप जो चाहते हैं वह संदर्भ नहीं है। और भी, आपके setActiveAnimation फ़ंक्शन में आप इस संदर्भ को एक तर्क के रूप में पारित मान की एक प्रति पर सेट कर रहे हैं, जो कोड को फ़ंक्शन से बाहर निकलने पर अमान्य संदर्भ देता है। शायद एक सूचक आप के अनुरूप होगा?

वर्ग शरीर में:

MaJR::Animation* activeAnimation; 

और setActiveAnimation समारोह:

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

आपका विश्लेषण अच्छा है, लेकिन मैं कोड के साथ एक उत्तर को ऊपर नहीं उठा सकता जो संदर्भ द्वारा पारित पैरामीटर के पते को संग्रहीत करता है। यदि आप बाद में उपयोग के लिए पॉइंटर संग्रहीत कर रहे हैं, तो कॉलर को आजीवन विचारों के बारे में अधिक जानकारी देने के लिए, पॉइंटर पैरामीटर स्वीकार करें। –

+0

@ बेन वोगेट: मुझे नहीं पता, मैं अपने कोड में _raw पॉइंटर्स_ का उपयोग नहीं करता हूं। –

+1

मैं मानता हूं कि एक कच्चा सूचक स्मार्ट पॉइंटर जितना अच्छा नहीं है। लेकिन एक संदर्भ बहुत खराब है। फिक्स के लिए +1। –

1

आप परिभाषा समय पर संदर्भ बाध्य करने के लिए की जरूरत है। सदस्य संदर्भों के लिए इसका मतलब कन्स्ट्रक्टर की प्रारंभिक सूची में है। इसके अलावा बाध्यकारी घोषणा के बाद फिर से असाइन नहीं किया जा सकता है।

यदि आपके पास Actor ऑब्जेक्ट्स के इंस्टीटेशन समय पर ऑब्जेक्ट (संदर्भ प्राप्त करने के लिए) नहीं है, तो आपकी अगली सबसे अच्छी शर्त पॉइंटर्स का उपयोग करना है जिसे बाद में आवश्यकतानुसार फिर से सौंप दिया जा सकता है।

6

जब आपके पास एक वर्ग है जो आपके वर्ग में सदस्य है, तो आपको इसे निर्माता में प्रारंभ करना होगा। एक बार इसे प्रारंभ करने के बाद, आप इसे और नहीं बदल सकते हैं (अच्छी तरह से आप मूल्य बदल सकते हैं लेकिन यह कहां संदर्भित नहीं करता है)।

सक्रिय करें इसके बजाय एक पॉइंटर एनीमेशन।

2

आप एक प्रारंभिक संदर्भ घोषित नहीं कर सकते हैं। इसका मतलब है कि जब आप कक्षा Actor से कोई ऑब्जेक्ट बनाते हैं तो आप संदर्भ को प्रारंभ करना चाहते हैं या आप संदर्भ का उपयोग नहीं कर सकते हैं। यदि आपको गतिशील रूप से इसे बदलने की आवश्यकता है, तो आप एक पॉइंटर या शायद बेहतर, स्मार्ट पॉइंटर (उदा।, std::unique_ptr, shared_ptr) का उपयोग कर सकते हैं। यदि आप सी ++ 11 का उपयोग नहीं कर सकते हैं, तो बूस्ट से smart pointers पर एक नज़र डालें।

संबंधित मुद्दे