Una classe contiene std::vector<int*>
. Il codice esterno richiede l'accesso in sola lettura a questo vettore, non dovrebbe essere in grado di modificare i contenuti (né i puntatori né i loro contenuti). All'interno della classe, i valori possono cambiamento (ad esempio double_values()
, e così la loro memorizzazione come std::vector<const int*>
non è possibile.Trattore vettoriale <int*> come vettore <const int*> senza copiare (C++ 0x)
c'è un modo per restituire l'std::vector<int*>
come std::vector<const int*>
senza fare una copia? Ci si sente come se non ci dovrebbero essere, perché const è semplicemente in funzione al momento della compilazione di dire ciò che può e non può essere modificato
Codice:. (compilare 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;
}
possibile duplicato di [vettoriale e const] (http://stackoverflow.com/questions/2102244/vector-and-const) –
vedere http://stackoverflow.com/questions/2868485/cast-vectort-to- vectorconst-t – WeaselFox
@Bo: Questa domanda non risponde a questa domanda, davvero. E WeaselFox 'è irrilevante anche a causa del puntatore indiretto. – Xeo