簡體   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