![](/img/trans.png)
[英]Should I declare method “const” if it is “shallow const” only, not “deep 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
聲明。 但是, dataStore
和mapBufferRange
都調用OpenGL方法,這些方法改變了GPU上對象的狀態(分別是glBufferData
和glMapBufferRange
)。 我想聲明它們沒有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.