2015-10-21 7 views
5

से अमान्य रूपांतरण मैं कक्षा के निर्माता को किसी अन्य वर्ग के किसी ऑब्जेक्ट में एक पॉइंटर के माध्यम से स्टोर करना चाहता हूं। ऐसा करने का सही तरीका क्या है?'कॉन्स्ट टाइप *' से 'टाइप *'

यदि मैं MyClass1* ptr को const MyClass1* ptr के साथ प्रतिस्थापित करता हूं तो कोई त्रुटि नहीं है, लेकिन इस मामले में मुझे लगता है कि मैं अब ptr नहीं बदल सकता। मुझे क्या हासिल करने का सही तरीका क्या है?

example.cpp

class MyClass1{ 
    public: 
     int a; 
     int b; 
}; 

class MyClass2{ 
    MyClass1* ptr; 
    public: 
     MyClass2(const MyClass1& obj){ptr = &obj;}; 
}; 

int main(int argc, char* argv[]){ 
    MyClass1 object1; 
    object1.a = object1.b = 0; 
    MyClass2 object2(object1); 

    return 0; 
} 

यह g++ -o example example.cpp के माध्यम से संकलित मुझे इस त्रुटि

example.cpp: In constructor ‘MyClass2::MyClass2(const MyClass1&)’:

example.cpp:10:37: error: invalid conversion from ‘const MyClass1*’ to ‘MyClass1*’ [-fpermissive]

MyClass2(const MyClass1& obj){ptr = &obj;};

+3

संभावित डुप्लिकेट [कॉन्स int \ *, const int \ * const, और int const \ *?] के बीच क्या अंतर है (http://stackoverflow.com/questions/1143262/what-is-the-difference -बेटवीन-कॉन्स-इंट-कॉन्स्ट-इंट-कॉन्स्ट-एंड-इंट-कॉन्स्ट) –

+0

आप अपने 'obj' तर्क के' कॉन्स्ट 'संशोधक को क्यों नहीं हटाते? इसके अलावा आप संदर्भ के बजाय सीधे पॉइंटर पास कर सकते हैं। – aslg

+0

@aslg: क्योंकि मैं नहीं चाहता कि निर्माता वस्तु को संशोधित कर सके। (मुझे पता है कि उस वस्तु को वास्तविक रूप से संशोधित करने वाला कुछ भी नहीं है) – giusva

उत्तर

2

दे आप बात यह है कि करने के लिए है, तो अपने समारोह की जरूरत है ptr अंकों की अपने तर्क लेने के लिए बदलना चाहते हैं गैर- const संदर्भ (MyClass2 इसे संशोधित कर सकता है):

MyClass2(MyClass1& obj) { ptr = &obj; } 

या, यदि आप बात को संशोधित करने कि ptr अंक है, तो ptr के रूप में घोषित किया जाना चाहिए इरादा नहीं है एक सूचक-हैं- const:

const MyClass1* ptr; 

इन समाधानों में से दोनों को संकलित करने के कोड का कारण होगा ।

+0

'const MyClass1 &' असुरक्षित है क्योंकि अस्थायी – CoffeeandCode

+1

में पारित किया जा सकता है यह भी असुरक्षित है क्योंकि 'कक्षा 2' ऑब्जेक्ट की तुलना में कम जीवनकाल वाला गैर अस्थायी ऑब्जेक्ट पारित किया जा सकता है। सामान्यतः, गैर-मालिक संदर्भों को संग्रहीत करना/पॉइंटर्स लंबे समय से इन आजीवन मुद्दों के कारण परेशानी के लिए पूछ रहे हैं। – emlai

+0

@zenith: मेरे एल्गोरिदम में 'कक्षा 1' की वस्तु का जीवनकाल लंबा रहता है कि 'कक्षा 2' की वस्तु में से एक जिसमें पहले के लिए सूचक होता है। हालांकि यह सामान्य रूप से सामान्य रूप से सच नहीं है। मैं इस घटना को कैसे ध्यान में रख सकता हूं? – giusva

0

पहले अतिरिक्त निकालें;

MyClass2(const MyClass1& obj){ptr = &obj;} 

समारोह अंदर स्थिरांक तर्क (इसे बाद में संशोधित कर सकता है) पारित कर सकते हैं नहीं है, तो यह काम कर सकते हैं:

MyClass2(MyClass1 & obj){ 
    ptr = &obj; 
} 

लेकिन यहाँ & obj का मूल्य स्थानीय गुंजाइश निकल जाता है।

2

अंतिम कुछ टिप्पणियों के आधार पर उत्तर देना।

मैं तुम्हें स्थिरांक का एक उदाहरण दे देंगे ints के साथ संकेत के लिए आवेदन किया,

int a = 2; 
int b = 3; 

int*    p1 = &a; // Modifiable pointer modifiable value 
const int*  p2 = &a; // Modifiable pointer const value 
int* const  p3 = &a; // Const pointer  modifiable value 
const int * const p4 = &a; // Const pointer  const value 

*p1 = 3; // Ok, modifiable left-value 
*p2 = 4; // Error: non-modifiable left-value 
*p3 = 5; // Ok 
*p4 = 6; // Error 

p1 = &b; // Ok: modifiable pointer 
p2 = &b; // Ok 
p3 = &b; // Error 
p4 = &b; // Error 

आपके मामले में, आप एक परिवर्तनीय सूचक लेकिन एक स्थिरांक मूल्य के लिए देख रहे हैं। तो अगर आप दूसरे मामले चाहते हैं,

const MyClass1* ptr; 

(राशि है जो आप मूल रूप से किया था)

यह वास्तव में सूचक को बदलने की कोशिश नहीं की थी आप प्रतीत होता है?

2

मुझे टिप्पणी से पता है कि आप पॉइंटर की सामग्री को संशोधित करना चाहते हैं, ऑब्जेक्ट पॉइंटर इंगित नहीं करते हैं, इसलिए ptr पॉइंटर const MyClass1* ptr के रूप में घोषित करें। इसका मतलब है कि ptr एक सूचक है जो const MyClass1 को संदर्भित करता है। तो आप सूचक बदल सकते हैं, लेकिन आप पॉइंटर द्वारा संदर्भित ऑब्जेक्ट को संशोधित करने में सक्षम नहीं हैं।

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