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

Nel*_*ius 6 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_;
};
Run Code Online (Sandbox Code Playgroud)

这些方法都没有改变BufferObject对象的状态,所以它们都可以声明const.然而,dataStoremapBufferRange这两个呼叫的OpenGL方法,其中(改变GPU上的对象的状态glBufferDataglMapBufferRange分别).我想声明它们,但没有const表明它们正在修改GPU上的状态.

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

Rei*_*ica 4

你是对的,因为它们不会修改对象本身的实际状态,所以你可以选择。

虽然没有硬性规定,但“const尽可能使用”绝对不是通用的方法。请参阅类似的函数std::vector::operator[],它不会更改vector对象的成员,但仍然提供非const版本(和不同的const版本)。

看待这个问题的一个好方法是:假设您有一个BufferObject,并将其传递给一个采用 的函数const BufferObject&。如果该函数调用,它会扰乱您的期望(您期望保持的不变量)吗dataStore()?如果是这样,请勿标记dataStore()const

为了解决您的特殊情况,我认为您是正确的,应该将这些函数保留为非const. 虽然它们不会修改 C++ 对象的物理内容,但它们修改该 C++ 对象所表示的实体的逻辑状态。