我有一個類Reader
,它提供對二進制文件的訪問以對其執行讀取操作。Const方法臨時更改對象
該文件在同一文件中包含多個偏移量列表,其中要找到數據。這意味着,要獲得某些數據段,必須從某個位置讀取偏移量,然後跳轉到該偏移量,再次讀取偏移量,在那裏跳轉等,直到達到實際數據。
類認爲,在每次調用諸如
// reads 4 bytes and advances the position by 4 bytes
uint32 Reader::readOffset() { /* */ }
或
// moves the position to offset
void Reader::jumpTo(uint32 offset) { /* */ }
的方法,那些方法顯然不能const
因爲它們的移動讀取位置調整讀取位置。
對於文件的幾個層次之間方便的導航中,類提供的堆疊,其中,根據需要可以壓入和彈出的偏移:
uint32 someOffset = reader.readOffset();
reader.pushOffset(); // remember position
reader.jumpTo(someOffset); // do something on another position
reader.popOffset(); // go back to where we were before
那些壓入/彈出方法不能是const
爲好,因爲它們改變偏移堆棧。
現在的問題是方便的方法,它應該從文件內部的已知位置提取數據。無論當前的閱讀位置如何,他們都必須工作,不要觸摸它。在設計上,他們應該是const
,但這不起作用:
uint32 Reader::readSomeDataFromKnownLocation() const
{
pushOffset();
jumpTo(1234ul);
uint32 data = readData();
popOffset();
return data;
}
我做知道,這種方法會留下對象在相同的狀態,因爲它是調用前,但我仍然不能讓它const
,因爲我在其中使用的每個方法都是非const
。
所以,我的問題是,什麼是最好的方法,當在一個「按設計」const
方法臨時改變一個對象的狀態?
我想過const_cast<Reader*>(this)
,但這似乎是一種駭人聽聞的方法。或者你認爲在這種情況下是否合理?
如果它是常量設計,那麼它是一個常量,不應該改變。如果它會被改變,那麼它不是一個常量。 –
這種變化只發生在內部和臨時。該方法將確保返回時的最終對象狀態與用戶在調用之前的狀態「相同」。這就是我想通過將其標記爲'const'來顯示的內容。 – Dienes
不正確,您無法驗證它會發生。代碼(或線程)可能會在您跳過並從文件中讀取後立即失敗。那麼對象本身處於不同的狀態(認爲多線程與邪惡的線程殺死其他線程)。 –