我正在尝试学习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 第一个指针吗?
答案 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];
}
};