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?

1
demandé sur sth 2009-07-17 13:12:25

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.

6
répondu Martin Liversage 2009-07-17 09:19:16

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.

3
répondu AProgrammer 2009-07-17 11:54:03

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

2
répondu CsTamas 2009-07-17 09:30:24

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_; }
};
1
répondu xtofl 2009-07-17 10:17:03