繁体   English   中英

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

[英]Should I declare a method const, when underlying OpenGL state is modified

以下类封装了缓冲区的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上的状态。

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

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

虽然没有严格的规则,但“尽可能使用const ”绝对不是通用的方法。 请参考std::vector::operator[]类的函数 - 它不会更改vector对象的成员,但仍提供非const版本(以及不同的const版本)。

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

为了满足您的特定情况下,我认为你是正确的,应该让这些功能的非const 虽然它们不修改C ++对象的物理内容,但它们确实修改了该C ++对象所表示的实体的逻辑状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM