2009-07-17 1 views
1

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

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**. 

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

+0

Указатель на указатель на указатель на ..... Похож на плохой дизайн. Это C++ - используйте 'std :: vector' и возвращайте ссылки. –

ответ

6

Объявить свой метод так:

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

или

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

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

+0

Да, это сработало! (Я использовал второй формат :-) Спасибо большое! – 2009-07-17 09:38:13

2

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

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

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

+0

«Разработчики имеют лучшие дела, чем намеренно нарушать их API». :) –

+0

Хотя вы правы в возврате ссылки на 'std :: vector' –

+0

Последний констант не нужен и может изменить то, что можно сделать с возвращаемым значением. –

3

Вы не можете назначить float**float 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++ заключается в том, что при добавлении константы перед звездой вы должны добавить константу перед каждым следующим.

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

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

+0

Ну, мое правило было только для * добавления *, а не для удаления.В C++, а также в C вы можете удалить const только до последней звезды (я также добавил это к вышеприведенному правилу). См. 4.4/4 (мой пример на самом деле является стандартом) – AProgrammer

+0

Я удалил свой предыдущий комментарий, поскольку он был основан на непонимании вашего ответа. –

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^