2010-10-29 33 views
12

पर ओवरलोडेड ऑपरेटरों का उपयोग करके मैंने < < कक्षा के ऑपरेटर को अधिभारित किया। यदि मैं इसे पॉइंटर्स पर उपयोग करना चाहता हूं, तो मुझे ऑपरेटर को अधिभारित करना होगा, जैसे कि निम्नलिखित?पॉइंटर्स

class A { 
    std::string operator<<(std::string&); 
} 

aInst << "This works"; 
aPointer << "This doesnt work"; 
aPointer->operator<<("Whereas this works but is useless"); 

मुझे आशा है कि आप मेरी मदद कर सकते हैं।

हेनरिक

उत्तर

23

आप सूचक पहले भिन्नता की जरूरत है।

A *ptr = new A(); 
(*ptr) << "Something"; 

केवल दूसरी तरह जिस तरह से आप ऊपर

संपादित वर्णित है: नीचे आंद्रे के समाधान के रूप में अच्छी तरह से व्यावहारिक है, लेकिन जैसे उन्होंने कहा कि यह एक अच्छा विचार नहीं हो सकता है।

3

आप ऐसा नहीं कर सकते हैं। ऑपरेटर फ़ंक्शंस केवल उन ऑपरेटरों के लिए माना जाता है जिनमें उनके बीच गणना या कक्षा प्रकार होते हैं।

आप सभी एक सूचक को स्थानांतरित करने के बाद, लेकिन कक्षा नहीं। आपको स्पष्ट रूप से कहना होगा कि आप पॉइंटर को पहले संदर्भित करके क्लास ऑब्जेक्ट में स्थानांतरित करना चाहते हैं।

+0

@ एसबीआई, धन्यवाद। निश्चित –

+0

(ध्यान दें कि "वर्ग प्रकार" में structs और यूनियन शामिल हैं।) – sbi

+0

@sbi सही। structs और संघों कक्षाएं हैं। ऑपरेटर फ़ंक्शंस पर विचार किया जाता है जब "वर्ग" कक्षा-कुंजी के साथ घोषित कक्षाओं के लिए structs और यूनियन एक उपयुक्त ऑपरेटर के संचालन होते हैं। –

0

आम तौर पर ऐसा करने का कोई अच्छा कारण नहीं है, क्योंकि semantically ऑपरेटर < < स्ट्रीम ऑब्जेक्ट का संदर्भ संदर्भ। और तकनीकी रूप से आप मूल रूप से ऐसा नहीं कर सकते हैं।

+2

नहीं, अर्थात् 'ऑपरेटर << 'बाएं हाथ की तरफ तर्क वापस करना चाहिए। –

10

पहले, मानक परंपराओं से चिपके रहते हैं, अपने operator<< इस तरह घोषित किया जाना चाहिए:

class A { 
    A& operator<<(const std::string&); 
}; 

अब, तकनीकी रूप से, आप हिस्सा क्या आप निम्नलिखित वैश्विक समारोह को लागू करने से चाहते हैं की अचीवर सकता है:

A * operator<< (A * a, const std::string& s) { (*a) << s; return a; } 

इस तरह के रूप में बयान की अनुमति होगी:

लेकिन, आप निम्नलिखित लिखने के लिए सक्षम नहीं होगा:

aPointer << "this will not compile."; 

किसी भी मामले में, इस तरह के एक ऑपरेटर लेखन भ्रमित, सबसे अच्छे रूप होगा। आप

(*aPointer) << "this will be printed."; 

की अधिक सरल वाक्य रचना के साथ रहते हैं और कोड है कि स्थापित परंपराओं से चिपक दूसरों अनुमति देने के लिए (और अपने आप, कुछ ही हफ्तों में) अपने कोड को पढ़ने के लिए लिखना चाहिए।

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