Una clase contiene un std::vector<int*>
. El código externo necesita acceso de solo lectura a este vector, no debería poder modificar los contenidos (ni los punteros ni sus contenidos). Dentro de la clase, los valores puede cambio (por ejemplo double_values()
, y así almacenarlas como std::vector<const int*>
no es posible.Trate el vector <int*> como vector <const int*> sin copiar (C++ 0x)
¿Hay una manera de devolver el std::vector<int*>
como std::vector<const int*>
sin hacer una copia? Es mucho que tendría ser, porque const es simplemente operando en tiempo de compilación para decir lo que puede y no puede ser modificado
Código:. (compilar con 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;
}
posible duplicado de [vector y const] (http://stackoverflow.com/questions/2102244/vector-and-const) –
ver http://stackoverflow.com/questions/2868485/cast-vectort-to- vectorconst-t – WeaselFox
@Bo: Esa pregunta no responde a esta, realmente. Y WeaselFox 'también es irrelevante debido a la indirección del puntero. – Xeo