Comment retourner const Float** d'une fonction C++
j'ai une classe qui détiennent un tableau " float ** table
". Maintenant je veux avoir la fonction de membre pour le retourner, mais je ne veux pas qu'il soit modifié en dehors de la classe. Alors j'ai fait ceci:
class sometable
{
public:
...
void updateTable(......);
float **getTable() const {return table;}
private:
...
float **table;
}
cela compile OK quand j'appelle getTable avec un objet constant. Maintenant, j'ai essayé de
faites-le plus sûr en déclarant getatable comme " const float **getTable()
". J'ai eu
l'erreur de compilation suivante:
Error:
Cannot return float**const from a function that should return const float**.
pourquoi? Comment puis-je éviter que la table soit modifiée à l'extérieur de la classe?
4 réponses
Déclarez votre méthode comme ceci:
float const* const* getTable() const {return table;}
ou
const float* const* getTable() const {return table;}
si vous préférez.
vous ne pouvez pas attribuer un float**
à un float const**
parce qu'il permet de modifier un objet const:
float const pi = 3.141592693;
float* ptr;
float const** p = &ptr; // example of assigning a float** to a float const**, you can't do that
*p = π // in fact assigning &pi to ptr
*ptr = 3; // PI Indiana Bill?
les règles C et c++ diffèrent sur ce qui est autorisé.
-
C++ règle est que lorsque vous ajoutez un const devant une étoile, vous devez ajouter un const avant chaque suivant.
-
c règle est que vous ne pouvez ajouter un const avant la dernière étoile.
Dans les deux langues, vous pouvez supprimer un const seulement avant la dernière étoile.
vous pourriez déclarer votre méthode comme
const float * const * const getTable() const {return table;}
mais même ceci (le const - près du nom de la fonction) n'empêcherait pas le client d'essayer de le supprimer. Vous pouvez retourner la référence à la place, mais le mieux serait d'utiliser un vecteur std::pour la table et de retourner const ref à elle-à moins d'utiliser un tableau de style C est un must
bien que vous puissiez clairement taper la syntaxe comme ça, je la trouve beaucoup plus lisible pour définir quelques typographies pour les tableaux multi-dimensions.
struct M {
typedef double* t_array;
typedef const double t_carray;
typedef t_array* t_matrix;
typedef const t_carray* t_cmatrix;
t_matrix values_;
t_cmatrix values() const { return values_; }
t_matrix values() { return values_; }
};