Lớp học chứa std::vector<int*>
. Mã bên ngoài cần quyền truy cập chỉ đọc vào vectơ này, không được sửa đổi nội dung (không phải con trỏ hoặc nội dung của chúng). Bên trong lớp, các giá trị thể thay đổi (ví dụ double_values()
, và do đó lưu trữ chúng như là một std::vector<const int*>
là không thể.Xử lý véc tơ <int*> làm vector <const int*> mà không cần sao chép (C++ 0x)
Có cách nào để trả lại std::vector<int*>
như một std::vector<const int*>
mà không làm một bản sao? Nó cảm thấy như có nên được, vì const chỉ đơn giản là hoạt động ở thời gian biên dịch để nói những gì có thể và không thể được sửa đổi
Mã số:. (biên dịch với 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;
}
bản sao có thể có của [vector và const] (http://stackoverflow.com/questions/2102244/vector-and-const) –
xem http://stackoverflow.com/questions/2868485/cast-vectort-to- vectorconst-t – WeaselFox
@Bo: Câu hỏi đó không trả lời câu hỏi này, thực sự. Và WeaselFox 'cũng không liên quan nữa vì con trỏ vô hướng. – Xeo