सी ++ में, एक कॉन्स विधि है जो एक गैर-कॉन्स्ट ऑब्जेक्ट में एक पॉइंटर लौटा रही है जिसे बुरी आदत माना जाता है? उदाहरण के लिए। निम्नलिखित विधियों पर विचार करें:सी ++ में, एक कॉन्स विधि है जो एक गैर-कॉन्स्ट ऑब्जेक्ट को पॉइंटर लौटाती है जिसे बुरी आदत माना जाता है?
// Makes perfect sense
bool isActive() const { return m_isActive; }
// Makes perfect sense, both consts ensure nothing is modified
const SomeObject* someObject() const { return m_someObject; }
// Makes perfect sense, no const because SomeObject is mutable,
// thus MyClass is indirectly mutable
SomeObject* someObject() { return m_someObject; }
// Makes no sense, if you're just returning a pointer to a const object,
// then the method should clearly be const since nothing can be modified
const SomeObject* someObject() { return m_someObject; }
अंतिम संयोजन मुझे पहेली करता है: क्या निम्न बुरी प्रथा माना जाता है?
SomeObject* someObject() const { return m_someObject; }
क्योंकि वर्ग कि विधि रिटर्न const नहीं है, लेकिन विधि, है यह कुछ हद तक व्यर्थ है जब से तुम SomeObject
को संशोधित कर सकता है और इस तरह परोक्ष रूप से अपने वर्ग को संशोधित ... ताकि प्रपत्र बुरा व्यवहार माना जाता है? जैसे क्या आप इसे केवल निम्न में से किसी एक का उपयोग कर सकते हैं?
const SomeObject* someObject() const { return m_someObject; }
SomeObject* someObject() { return m_someObject; }
वास्तविक दुनिया स्थिति: मैं एक स्मार्टफोन खेल है, जिसमें एक Game
वर्ग है लिख रहा हूँ। Game
वर्ग, कई तरीके है जिसके InputManager
, AudioManager
तरह उपयोगिता वर्गों के लिए संकेत वापसी, आदि
class Game
{
public:
InputManager* inputManager() const { return m_inputManager; }
...
private:
InputManager* m_inputManager;
...
}
यह बिल्कुल कोई मतलब है inputManager()
स्थिरांक बनाने के लिए होता है के बाद से वस्तु यह रिटर्न नहीं है? (और नहीं होना चाहिए, InputManager
जरूरतों के बाद से परिवर्तनशील के लिए अपने राज्य को अपडेट करने की होने के लिए, आदि)
या मैं और अधिक सही विधि के व्यवहार को प्रतिबिंबित करने के विधि के const
संशोधक को दूर करना चाहिए? इस तरह अगर मेरे पास const Game
था, तो मैं inputManager()
पर कॉल नहीं कर सका और फिर Game
के इनपुट मैनेजर के साथ गड़बड़ कर सकता था, भले ही Game
const
था।
यदि ऑब्जेक्ट ए "ऑब्जेक्ट्स" ऑब्जेक्ट बी है, और आप ए को कॉन्स के रूप में देखना चाहते हैं, तो बी के लिए एक्सेसर भी होना चाहिए। यदि ए के पास बी नहीं है, तो सभी दांव बंद हैं। चूंकि ओपी बताता है, यह सी ++ में एक स्टाइलिस्ट मुद्दा है। एक और पैडेंटिक भाषा इसे लागू करेगी। –