एक वर्ग एक std::vector<int*>
शामिल हैं। बाहरी कोड को इस वेक्टर तक केवल पढ़ने के लिए उपयोग की आवश्यकता है, सामग्री को संशोधित करने में सक्षम नहीं होना चाहिए (न तो पॉइंटर्स या उनकी सामग्री)। कक्षा के अंदर, मूल्यों मई परिवर्तन (जैसे double_values()
, और इसलिए उन्हें भंडारण के रूप में एक std::vector<const int*>
संभव नहीं है।उपचार वेक्टर <int*> कॉपी किए बिना (C++ 0x)
वहाँ एक प्रतिलिपि बनाने के बिना एक std::vector<const int*>
रूप std::vector<int*>
वापस जाने के लिए कोई तरीका है? यह की तरह लगता है वहाँ होना चाहिए हो सकता है, क्योंकि स्थिरांक बस संकलन समय पर काम कर रहा है कहने के लिए क्या और बदला नहीं जा सकता कर सकते हैं
कोड:। (g++ -std=c++0x
साथ संकलन)
class ReadOnlyAccess
{
public:
ReadOnlyAccess(const std::vector<int*> & int_ptrs_param):
int_ptrs(int_ptrs_param)
{
}
const std::vector<int*> & get_int_ptrs() const
{
return int_ptrs;
}
std::vector<const int*> safely_get_int_ptrs() const
{
// will not compile (too bad):
// return int_ptrs;
// need to copy entire vector
std::vector<const int*> result(int_ptrs.size());
for (int k=0; k<int_ptrs.size(); k++)
result[k] = int_ptrs[k];
return result;
}
void double_values()
{
for (int*p : int_ptrs)
*p *= 2;
}
void print() const
{
for (const int * p : int_ptrs)
std::cout << *p << " ";
std::cout << std::endl;
}
private:
std::vector<int*> int_ptrs;
};
int main() {
ReadOnlyAccess roa(std::vector<int*>{new int(10), new int(20), new int(100)});
std::vector<const int*> safe_int_ptrs = roa.safely_get_int_ptrs();
// does not compile (good)
// *safe_int_ptrs[0] = -100000;
roa.print();
const std::vector<int*> & int_ptrs = roa.get_int_ptrs();
// changes are made to the internal class values via the accessor! nooooo!
*int_ptrs[0] = -100000;
roa.print();
return 0;
}
[वेक्टर और कॉन्स] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/2102244/vector-and-const) –
देखें http://stackoverflow.com/questions/2868485/cast-vectort-to- vectorconst-t – WeaselFox
@ बो: वह प्रश्न वास्तव में इसका उत्तर नहीं देता है। और WeaselFox 'सूचक संकेत के कारण भी अप्रासंगिक है। – Xeo