以下类封装了缓冲区的OpenGL名称,并提供了一些用于更改缓冲区状态的方法:
class BufferObject {
public:
explicit BufferObject( GLenum type );
virtual ~BufferObject();
// some methods omitted
void dataStore( GLsizeiptr size, const GLvoid* data, int usage );
void* mapBufferRange( GLintptr offset, GLsizeiptr length, int accessFlag );
void unmapBuffer() const;
private:
GLuint object_;
};
这些方法都没有改变BufferObject
对象的状态,所以它们都可以用const
声明。但是,dataStore
和mapBufferRange
都会调用OpenGL方法,这些方法会更改GPU上对象的状态(分别为glBufferData
和glMapBufferRange
)。我想在没有const
的情况下声明它们,以表明它们正在修改GPU上的状态。
在这种情况下,最佳做法是什么?
答案 0 :(得分:4)
你是对的,因为他们没有修改对象本身的实际状态,你可以选择。
虽然没有严格的规则,但#34;尽可能使用const
"绝对不是通用的方式。请参阅std::vector::operator[]
等函数 - 这些函数不会更改vector
对象的成员,但仍会提供非const
版本(以及不同的const
版本)。
查看此内容的一个好方法是:假设您有一个BufferObject
,并将其传递给一个const BufferObject&
的函数。如果该函数调用dataStore()
,它会弄乱你的期望(你期望持有的不变量)吗?如果是,请勿将dataStore()
标记为const
。
为了解决您的具体情况,我认为您是正确的,并且应该将这些功能保留为非const
。虽然他们不会修改C ++对象的物理内容,但他们做修改该C ++对象所代表的实体的逻辑状态。