我正在努力学习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正确性第一个指针吗?
与const
的正确性无关。如果你想要第一个指针…你需要返回一个指针:
const GLubyte* get_array(){return (GLubyte*)array;}
强制转换有效,因为数组在内存中连续表示。
但我很确定一个更好的解决方案,你想要实现可以用std::vector
而不是c风格数组设计。你到底想干什么?
这与const正确性无关。你不能返回一个GLubyte
s数组,就好像它是一个GLubyte
。如果您删除const
和&
,您将得到相同的错误消息(当然,除了错误消息将不再包含const
和&
)。
编辑响应您的编辑:如果您想返回引用到第一个元素,只需返回第一个元素:return array[0][0][0];
。如果您想返回指针到第一个元素,返回第一个元素的地址(return &array[0][0][0]
),并将返回类型更改为GLubyte*
而不是GLubyte&
。
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.
如果你在寻找某种多数组包装器那么我认为这可能接近你正在寻找的
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];
}
};