Как вернуть const Float** из функции C++
У меня есть класс, который содержит массивfloat ** table
Msgstr "Теперь я хочу, чтобы функция-член возвращала его, но не хочу, чтобы он был изменен вне класса. Поэтому я сделал это:
class sometable
{
public:
...
void updateTable(......);
float **getTable() const {return table;}
private:
...
float **table;
}
Это компилируется нормально, когда я вызываю getTable с постоянным объектом. Теперь я попытался сделать его более безопасным, объявив getTable как "const float **getTable()
Msgstr "Я получил следующую ошибку компиляции:
Error:
Cannot return float**const from a function that should return const float**.
Зачем? Как я могу избежать изменения таблицы вне класса?
4 ответа
Объявите свой метод следующим образом:
float const* const* getTable() const {return table;}
или же
const float* const* getTable() const {return table;}
Если вы предпочитаете.
Вы не можете назначить 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 float * const * const getTable() const {return table;}
но даже это (самый внешний const - рядом с именем функции) не помешает клиенту попытаться удалить его. Вместо этого вы можете вернуть ссылку, но лучше всего использовать std::vector для таблицы и возвращать в нее const ref - если только использование массива в стиле C не является обязательным
Хотя вы можете четко ввести синтаксис просто так, я нахожу гораздо более читабельным определять некоторые определения типов для многомерных массивов.
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_; }
};