当底层OpenGL状态被修改时,我应该声明一个方法常量吗
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
声明。然而,dataStore
和mapBufferRange
都调用OpenGL方法来更改GPU上对象的状态(分别为glBufferData
和glMapBufferRange
)。我想在没有const
的情况下声明它们,以表明它们正在修改GPU上的状态。
在这种情况下,最好的做法是什么?
你说得对,因为它们不会修改对象本身的实际状态,所以你可以选择。
虽然没有硬性规定,但"尽可能使用const
"绝对不是通用的方法。请参阅std::vector::operator[]
—它不会更改vector
对象的成员,但仍然提供非const
版本(以及不同的const
版本)。
一个很好的方法是:假设您有一个BufferObject
,并将其传递给一个使用const BufferObject&
的函数。如果该函数调用dataStore()
,它会打乱您的期望(您期望保持的不变量)吗?如果是,请不要将dataStore()
标记为const
。
为了解决您的特殊情况,我认为您是正确的,应该将这些函数保留为非-const
。虽然它们不修改C++对象的物理内容,但它们会修改由该C++对象表示的实体的逻辑状态。
相关文章:
- 用C++中的一个变量定义一个常量
- 从另一个常量标准::映射初始化一个常量标准::映射的一部分
- isdigit() 和 isalnum() 给出错误,因为输入是一个常量字符并且无法转换。其他可能查看输入是否为数字的方法?
- C++ 在 none 常量指针函数中返回一个常量指针
- 为什么重载"<<"需要一个常量参数?
- 为什么它是一个常量指针而不是指向常量指针
- 是一个常量句柄真的常量
- 将一个常量cstring附加到我自己的String类对象
- C++在类构造函数中定义了一个常量成员变量
- G++抱怨constexpr函数不是一个常量表达式
- 是一个常量字符串Still Preferrable
- 返回一个常量字符 *
- 将一个常量未签名的长流流式传输到流
- 从自定义 printf 函数返回一个常量字符*
- C++做虚函数总是必须是一个常量
- 我想将一个常量字符串写入包含另一个输入数据块的文件
- 如何计算初始化一个常量数组(制作常量查找表)
- C++:在初始化列表中传递一个常量 *p
- 我可以在 protobuf 中定义一个常量字符串吗?
- 初始化一个常量变量,如果失败则断言(c++)