我有一个类Reader
,可以访问二进制文件以对其执行读取操作。
此文件包含同一文件中的几个偏移列表,其中可以找到数据。这意味着,要获得某些数据段,必须从某个位置读取偏移量,然后跳转到该偏移量,再次读取偏移量,跳转到其他位置等,直到最终到达实际数据。
每次调用
之类的方法时,课程都会保持一个阅读位置// 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)
,但这似乎是一种hackish方法。或者你认为在这种情况下它是否合理?
答案 0 :(得分:1)
您可以创建位置字段mutable
,然后将您的逻辑只读方法标记为const
。
如果您希望在公共API中保留pushOffset
和popOffset
方法,则应引入const
的私有版本,并使用{{1}中的私有版本方法。