2011-06-08 4 views
5

Je souhaite une variable de membre, qui est un double pointeur. L'objet, pointeur double, ne doit pas être modifié depuis l'extérieur de la classe.Renvoie un double pointeur en lecture seule

Mon essai suivant donne un "conversion non valide de 'std :: string **' à 'const std :: string **'"

class C{ 

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

private: 
    std::string **myPrivate; 
}; 
  • Pourquoi est le même Construire valide si j'utilise juste un simple pointeur std::string *myPrivate
  • Que puis-je faire pour retourner un double pointeur en lecture seule? Est-il bon de faire une distribution explicite return (const std::string**) myPrivate?

+0

Que voulez-vous consomment: le pointeur ou la chaîne pointée? –

+0

Désolé de ne pas être clair, j'ai édité mon post. C'est la chaîne elle-même qui ne doit pas être modifiée. – Hugo

+1

Penser à eux comme "double pointeurs" peut être la racine de votre problème. Le terme "double pointeur" est celui que je n'ai jamais rencontré jusqu'à ce que je sois tombé sur SO, et je serais un peu intéressé de savoir quel nid (pas nécessairement sur SO) l'a créé. –

Répondre

3

Essayez ceci:

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

Le problème avec const std :: string ** est qu'il permet à l'appelant de modifier l'un des pointeurs, non déclarée const. Cela fait à la fois le pointeur et la classe de chaîne elle-même const.

+0

+1 même si je ne suis pas d'accord avec votre commande de 'const'. –

2

Si vous voulez être vraiment pointilleux:

class C { 

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

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

Il y a des cas très rares en C++ quand un pointeur brut (encore moins pour un double pointeur) est vraiment nécessaire, et votre cas ne pas coutures d'être l'un d'entre eux. Une façon correcte serait de retourner une valeur ou une référence, comme ceci:

class C{ 

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

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

Cela aurait été mon moyen préféré aussi - surtout avec une ficelle, mais je ne savais pas si l'affiche avait un autre type qui aurait pu l'exiger ... –

+0

Peut-être que j'aurais dû écrire ma motivation: je veux avoir accès à un tableau avec deux indices x [0] [1], j'ai donc créé un tableau de pointeurs. Mais même s'il aurait été possible de changer mon code dans une autre position, je voulais savoir comment gérer les "double-pointeurs" ou contourner un pointeur d'appel pro-pointeur. – Hugo