当底层 OpenGL 状态被修改时,我是否应该声明一个方法 const
Should I declare a method const, when underlying OpenGL state is modified
下面class封装了一个缓冲区的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_;
};
None 这些方法改变了 BufferObject
对象的状态,因此它们都可以用 const
声明。但是,dataStore
和 mapBufferRange
都调用 OpenGL 方法来更改 GPU 上对象的状态(分别为 glBufferData
和 glMapBufferRange
)。我想在没有 const
的情况下声明它们,以表明它们正在修改 GPU 上的状态。
在这种情况下应遵循的最佳做法是什么?
你是对的,因为他们不修改对象本身的实际状态,你可以选择。
虽然没有硬性规定,但 "use const
wherever possible" 绝对不是通用的方法。参考像 std::vector::operator[]
这样的函数——它不会改变 vector
对象的成员,但仍然提供非 const
版本(和不同的 const
版本)。
看待这个问题的一个好方法是:假设您有一个 BufferObject
,并将它传递给一个接受 const BufferObject&
的函数。如果该函数调用 dataStore()
,它会扰乱您的期望(您期望保持的不变量)吗?如果是这样,请不要将 dataStore()
标记为 const
。
为了解决您的特殊情况,我认为您是正确的,应该将这些功能保留为非 const
。虽然它们不修改 C++ 对象的物理内容,但它们 修改了由该 C++ 对象表示的实体的逻辑状态。
下面class封装了一个缓冲区的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_;
};
None 这些方法改变了 BufferObject
对象的状态,因此它们都可以用 const
声明。但是,dataStore
和 mapBufferRange
都调用 OpenGL 方法来更改 GPU 上对象的状态(分别为 glBufferData
和 glMapBufferRange
)。我想在没有 const
的情况下声明它们,以表明它们正在修改 GPU 上的状态。
在这种情况下应遵循的最佳做法是什么?
你是对的,因为他们不修改对象本身的实际状态,你可以选择。
虽然没有硬性规定,但 "use const
wherever possible" 绝对不是通用的方法。参考像 std::vector::operator[]
这样的函数——它不会改变 vector
对象的成员,但仍然提供非 const
版本(和不同的 const
版本)。
看待这个问题的一个好方法是:假设您有一个 BufferObject
,并将它传递给一个接受 const BufferObject&
的函数。如果该函数调用 dataStore()
,它会扰乱您的期望(您期望保持的不变量)吗?如果是这样,请不要将 dataStore()
标记为 const
。
为了解决您的特殊情况,我认为您是正确的,应该将这些功能保留为非 const
。虽然它们不修改 C++ 对象的物理内容,但它们 修改了由该 C++ 对象表示的实体的逻辑状态。