Как вернуть const Float ** из функции C ++ - PullRequest
1 голос
/ 17 июля 2009

У меня есть класс, который содержит массив "float ** table". Теперь я хочу, чтобы функция-член возвращала его, но не хочу, чтобы он был изменен вне класса. Итак, я сделал это:

class sometable 
{
  public:
   ...
   void updateTable(......);
   float **getTable() const {return table;}
  private:
    ...
    float **table;
}

Это компилируется нормально, когда я вызываю getTable с постоянным объектом. Теперь я пытался сделайте его более безопасным, объявив getTable как "const float **getTable()". я получил следующая ошибка компиляции:

Error:
  Cannot return float**const from a function that should return const float**.

Почему? Как я могу избежать изменения таблицы вне класса?

Ответы [ 4 ]

6 голосов
/ 17 июля 2009

Объявите свой метод следующим образом:

float const* const* getTable() const {return table;}

или

const float* const* getTable() const {return table;}

, если вы предпочитаете.

3 голосов
/ 17 июля 2009

Вы не можете назначить float** для float const**, потому что это позволит изменить объект 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?

Правила C и C ++ отличаются тем, что разрешено.

  • Правило C ++ состоит в том, что когда вы добавляете const перед звездой, вы должны добавлять const перед каждым последующим.

  • C правилом является то, что вы можете добавить const только до последней звезды.

На обоих языках вы можете удалить const только перед последней звездой.

2 голосов
/ 17 июля 2009

Вы можете объявить свой метод как

const float * const * const getTable() const {return table;}

но даже это (самый внешний const - рядом с именем функции) не помешает клиенту попытаться удалить его. Вместо этого вы можете вернуть ссылку, но лучше всего использовать std :: vector для таблицы и возвращать в нее const ref - если только использование массива в стиле C не является обязательным

1 голос
/ 17 июля 2009

Хотя вы можете четко вводить синтаксис таким же образом, я считаю, что гораздо удобнее определить некоторые определения типов для многомерных массивов.

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_; }
};
...