gpt4 book ai didi

c++ - 当底层 OpenGL 状态被修改时,我是否应该声明一个方法 const

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:37:33 24 4
gpt4 key购买 nike

下面的类封装了缓冲区的 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& 的函数。如果该函数调用 dataStore(),它会不会打乱您的预期(您希望保持的不变量)?如果是这样,请不要将 dataStore() 标记为 const

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

关于c++ - 当底层 OpenGL 状态被修改时,我是否应该声明一个方法 const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28603345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com