我有一个包含数组“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**.
为什么呢?如何避免将表修改为类的一部分?
答案 0 :(得分:6)
声明你的方法:
float const* const* getTable() const {return table;}
或
const float* const* getTable() const {return table;}
如果您愿意。
答案 1 :(得分:3)
您无法将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 :(得分:2)
您可以将方法声明为
const float * const * const getTable() const {return table;}
但即便如此(最外面的const - 函数名旁边)也不会阻止客户端尝试删除它。 您可以返回引用,但最好的方法是使用std :: vector作为表并将const ref返回给它 - 除非使用C样式数组是必须的
答案 3 :(得分: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_; }
};