当修改基础OpenGL状态时,我应该声明方法const吗?

时间:2015-02-19 09:58:54

标签: c++ opengl methods const

以下类封装了缓冲区的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声明。但是,dataStoremapBufferRange都会调用OpenGL方法,这些方法会更改GPU上对象的状态(分别为glBufferDataglMapBufferRange)。我想在没有const的情况下声明它们,以表明它们正在修改GPU上的状态。

在这种情况下,最佳做法是什么?

1 个答案:

答案 0 :(得分:4)

你是对的,因为他们没有修改对象本身的实际状态,你可以选择。

虽然没有严格的规则,但#34;尽可能使用const"绝对不是通用的方式。请参阅std::vector::operator[]等函数 - 这些函数不会更改vector对象的成员,但仍会提供非const版本(以及不同的const版本)。

查看此内容的一个好方法是:假设您有一个BufferObject,并将其传递给一个const BufferObject&的函数。如果该函数调用dataStore(),它会弄乱你的期望(你期望持有的不变量)吗?如果是,请勿将dataStore()标记为const

为了解决您的具体情况,我认为您是正确的,并且应该将这些功能保留为非const。虽然他们不会修改C ++对象的物理内容,但他们修改该C ++对象所代表的实体的逻辑状态。