Traktuj wektor <int *> jako wektor <const int *> bez kopiowania (C ++ 0x)
Klasa zawiera astd::vector<int*>
. Kod zewnętrzny wymaga dostępu tylko do odczytu do tego wektora, nie powinien mieć możliwości modyfikowania zawartości (ani wskaźników, ani ich zawartości). Wewnątrz klasy wartościmoże zmienić (np.double_values()
, a więc przechowywanie ich jakostd::vector<const int*>
nie jest możliwe.
Czy istnieje sposób na zwróceniestd::vector<int*>
jakstd::vector<const int*>
bez robienia kopii? Wydaje się, że powinno być, ponieważ const po prostu działa w czasie kompilacji, aby powiedzieć, co można i czego nie można zmodyfikować.
Kod: (kompiluj zg++ -std=c++0x
)
<code>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; } </code>