如何从C ++函数返回const Float **

时间:2009-07-17 09:12:25

标签: c++ constants

我有一个包含数组“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 个答案:

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