返回私有数组的第一个指针(编辑)

时间:2011-12-10 16:27:34

标签: c++ arrays

我正在尝试学习C ++和OpenGL ......

我想返回数组的第一个指针......但是维护const的正确性......

事情发生了:

   class Foo{
   private:
       GLubyte array[64][64][4];
   public:
       const GLubyte& get_array(){return array;}
   }

给了我这个编译错误:

:28: error: invalid initialization of reference of type 'const GLubyte&' from expression of type 'GLubyte (*)[64][4]'

你可以帮助我理解如何返回 const correctness 第一个指针吗?

4 个答案:

答案 0 :(得分:1)

这与const正确性无关。您无法返回GLubyte的数组,就好像它是一个GLubyte一样。如果您删除const&,则会收到相同的错误消息(除了错误消息不再包含const&之外)。

编辑以响应您的编辑:如果您想将引用返回到第一个元素,只需返回第一个元素:return array[0][0][0];。如果要将指针返回到第一个元素,请返回第一个元素(return &array[0][0][0])的地址,并将返回类型更改为GLubyte*而不是GLubyte& }。

答案 1 :(得分:1)

它与const正确性无关。如果你想要第一个指针......好吧,你需要返回一个指针:

const GLubyte* get_array(){return (GLubyte*)array;}

强制转换是因为数组在内存中连续表示。

但我非常确定使用std::vector代替C风格的数组可以设计出更好的解决方案。你究竟想做什么?

答案 2 :(得分:1)

array的类型为GLubyte * * *,因此您无法转换为引用,必须写入

GLubyte const & get_array() const { return array[0][0][0]; }

所以你得到了对数组的第一个元素的引用。但是如果你想要指针,你必须改变你的代码,如下所示

GLubyte const * get_array() const { return &(array[0][0][0]); }

如果你想要更好的C ++代码,你也可以看到Boost.MultiArray

答案 3 :(得分:0)

如果您正在使用某种多数组包装器,那么我认为这可能接近您所寻找的

class Foo{
private:
    std::vector<GLubyte> array;
    size_t x_sz, y_sz, z_sz;
public:
     Foo(size_t x, size_t y=1, size_t z=1)
     :   array(x*y*z),
         x_sz(x), y_sz(y), z_sz(z)
     {}

     const GLubyte& element_at(size_t x, size_t y=0, size_t z=0) const
     {
         return array.at(z*y_sz*x_sz+y*x_sz+x);
     }

     GLubyte& element_at(size_t x, size_t y=0, size_t z=0)
     {
         return array.at(z*y_sz*x_sz+y*x_sz+x);
     }

     GLubyte *data()           //returns array
     {
         return &vector[0];
     }

     const GLubyte *data() const //returns const array
     {
         return &vector[0];
     }
};