2011-06-08 29 views
5

Quiero una variable miembro, que es un puntero doble. El objeto al que apunta el puntero doble no se debe modificar desde fuera de la clase.Devolver un doble puntero de solo lectura

Mi siguiente intento se obtiene una "conversión inválida de 'std :: string **' a 'const std :: string **'"

class C{ 

public: 
    const std::string **getPrivate(){ 
     return myPrivate; 
    } 

private: 
    std::string **myPrivate; 
}; 
  • ¿Por qué es el mismo construcción válida si solo uso un simple puntero std::string *myPrivate
  • ¿Qué puedo hacer para devolver un doble puntero de solo lectura?

    ¿Es un buen estilo hacer un molde explícito return (const std::string**) myPrivate?

+0

¿Qué quiere constificar: el puntero o la cadena apuntada? –

+0

Perdón por no ser claro, edité mi publicación. Es la cadena en sí que no se modificará. – Hugo

+1

Pensar en ellos como "dobles punteros" puede ser la raíz de su problema. El término "doble puntero" es uno que nunca encontré hasta que encontré SO, y me gustaría saber qué idiota (no necesariamente en SO) lo originó. –

Respuesta

3

Prueba esto:

const std::string * const *getPrivate(){ 
    return myPrivate; 
} 

El problema con const std :: string ** es que permite a la persona que llama a modificar uno de los punteros, que no está declarado como const. Esto hace que tanto el puntero como la clase de cuerda sean const.

+0

+1 aunque estoy en desacuerdo con su orden de 'const'. –

2

Si quieres ser realmente exigente:

class C { 

public: 
    std::string const* const* const getPrivate(){ 
     return myPrivate; 
    } 

private: 
    std::string **myPrivate; 
}; 
2

Hay casos muy raros en C++, cuando en realidad se necesita un puntero en bruto (incluso menos para un puntero doble), y su caso no lo hace costuras para ser uno de ellos. Una forma adecuada sería devolver un valor o una referencia, como este:

class C{ 

public: 
    const std::string& getPrivate() const 
    { 
     return myPrivate; 
    } 

private: 
    std::string myPrivate; 
}; 
+0

Esta hubiera sido mi forma preferida también, especialmente con una cuerda, pero no sabía si el cartel tenía algún otro tipo que realmente podría haber requerido esto ... –

+0

Tal vez debería haber escrito mi Motivación: Quiero tener acceso a una matriz con dos índices x [0] [1], así que creé una matriz de punteros. Pero a pesar de que podría haber sido posible cambiar mi código en otra posición, quería saber cómo manejar "dobles punteros" o llamar a un experto punteros a punteros. – Hugo

Cuestiones relacionadas