2011-06-21 12 views
5

संभव डुप्लिकेट:
why isnt it legal to convert (pointer to pointer to non-const) to a (pointer to pointer to a const)क्यों नहीं कर सकते पूर्णांक ** C++ में स्थिरांक पूर्णांक ** लिए परिवर्तित किया जा

हाय मैं निम्नलिखित कोड है, लेकिन चारों ओर क्यों इस मेरे सिर लपेटो नहीं कर सकते काम नहीं करता - मुझे यह कहते हुए एक त्रुटि मिलती है कि "int ** से const int int ** में कनवर्ट नहीं किया जा सकता है"। हालांकि, अगर मैं printValues ​​के पहले तर्क को "const int * const * myArray" के रूप में बदलता हूं, तो यह सब ठीक काम करता है। मुझे पता है कि शायद मुझे नीचे दिए गए किसी भी का उपयोग नहीं करना चाहिए, लेकिन मुझे समझ में नहीं आता कि यह बिल्कुल संकलित क्यों नहीं होता है। क्या आपके पास मुख्य() में निरंतर घोषित किए बिना एक स्थिर पूर्णांक में पॉइंटर के लिए पॉइंटर नहीं हो सकता है?

#include <iostream> 

int printValues(const int ** myArray, const long nRows, const long nCols) 
{ 
for (long iRow = 0; iRow < nRows; iRow++) 
{ 
    for (long iCol = 0; iCol < nCols; iCol++) 
    { 
     std::cout << myArray[iRow][iCol] << " "; 
    } 
    std::cout << "\n"; 
} 
return 0; 

} 

int main() 
{ 
const long nRows = 5; 
const long nCols = 8; 

int** myArray = new int* [nRows]; 

for (long iRow = 0; iRow < nRows; iRow++) 
{ 
    myArray[iRow] = new int [nCols]; 
} 

for (long iRow = 0; iRow < nRows; iRow++) 
{ 
    for (long iCol = 0; iCol < nCols; iCol++) 
    { 
     myArray[iRow][iCol] = 1; 
    } 
} 

printValues(myArray, nRows, nCols); 

return 0; 
} 
+5

देखें ["मुझे एक फू ** → फू कॉन्स ** परिवर्तित करने में त्रुटि क्यों मिल रही है?"] (Http://www.parashift.com/c++-faq-lite/const-correctness.html#faq- 18.17) –

+0

क्योंकि यह वास्तव में आपको कॉन्स्ट-शुद्धता का उल्लंघन करने की अनुमति देता है। मैं डुप्ली ढूंढने की कोशिश करूंगा। –

+0

मुझे कभी एहसास नहीं हुआ कि यह इतना लोकप्रिय सवाल था, मैंने जो जवाब देखा है, उनमें से मुझे लगता है [मानक से एक] [http://stackoverflow.com/a/29240053/1708801) सबसे अच्छा है। –

उत्तर

1

संपादित करें:

आप स्थिरांक-शुद्धता का उल्लंघन कर रहे हैं। यह कहकर कि आप एक पॉइंटर-टू-ए-पॉइंटर चाहते हैं, आप मूल कॉन्स्ट ऑब्जेक्ट को संशोधित करने की अनुमति देकर स्वयं को सेट कर रहे हैं। कॉन्स एक अनुबंध है। बिना किसी कलाकार के होने की अनुमति देकर, आप स्वयं को एक कॉन्स्ट ऑब्जेक्ट को बाद में संशोधित करने की अनुमति देने के लिए सेट अप कर रहे हैं।

+1

आप हमेशा गैर-'const' को 'const' में परिवर्तित कर सकते हैं। @ जेम्स मैकनेलिस के लिंक को पढ़ें कि यह विशिष्ट परिदृश्य 'const' को non-'const' में क्यों परिवर्तित करता है। –

+0

(0 ए 0 डी की टिप्पणी के संदर्भ में) यह भी सच है यदि मैं फ़ंक्शन तर्क को "const int * const * myArray" में बदलता हूं, है ना? और अगर मैं –

+0

@ 0 ए0 डी करता हूं तो मैं खुशी से संकलित करता हूं: मुझे नहीं पता कि इसका मतलब क्या है।आप कुछ शून्य (int * foo) {const int bar = * foo कर सकते हैं; } 'पूरे दिन लंबा। –

6
  • int ** है: "एक पूर्णांक के लिए सूचक के लिए सूचक"।
  • const int ** है: "एक पॉइंटर को एक स्थिर पूर्णांक के लिए सूचक"।

एक दूर से प्राप्त किए गए सादृश्य:

  • एक नोट है कि एक और नोट के स्थान कि एक जार
  • एक नोट है कि एक और नोट के स्थान उस स्थान का वर्णन का वर्णन के स्थान का वर्णन का वर्णन करता है एक की जार

आप केवल एक जार कि बंद नहीं है अंदर एक कुकी रख सकते हैं बंद कर दिया।

अब, दूसरे नोट को पहले नोट की फोटोकॉपी के साथ बदलने का विचार करें। क्या आपके पास कोई गारंटी है कि इस नोट को इंगित करने वाला अंतिम जार बंद हो जाएगा और किसी भी कुकीज़ को स्वीकार नहीं कर सकता है? const का उपयोग एक अनुबंध है और आप दो संदर्भों के संकेत के माध्यम से इस अनुबंध को पूरा नहीं कर सकते हैं।

+0

जार और कुकी के मुकाबले कोड द्वारा इसे समझाया जाना बेहतर है। जार और कुकी सी ++ अर्थशास्त्र नहीं हैं, और यदि समानता में कोई है तो दोष को देखना मुश्किल होगा। – Nawaz

+0

@ नवाज: ज्यादातर लोगों को अपने दिमाग को पॉइंटर्स के चारों ओर लपेटना मुश्किल लगता है, इसलिए मैंने सोचा कि एक ठोस उदाहरण उपयोगी होगा। मैंने इसे अन्य उत्तरदाताओं को कोड शर्तों में प्रस्तुत करने के लिए छोड़ दिया ... –

+3

कुकीज़ पॉइंटर्स की तुलना में निश्चित रूप से अधिक स्वादिष्ट हैं। –

1

असल में, ऐसा इसलिए है क्योंकि यह संकेतक के स्तर को बदलने और अन्य वैध, गैर-कॉन्स्ट-उल्लंघन करने वाले अर्थशास्त्र के माध्यम से संभव है, यदि आप केवल शीर्ष स्तर पर हैं तो आप कॉन्स्ट के आसपास काम कर सकते हैं। वास्तव में सुरक्षित होने के लिए आपको एक से अधिक स्तरों पर कॉन्स जोड़ना होगा।

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