2

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)たが、これはハックなアプローチのようです。それとも、このシナリオではそれが正当化されると思いますか?

4

1 に答える 1

1

位置フィールドを作成してからmutable、論理的に読み取り専用のメソッドをとしてマークすることができますconst

pushOffsetpopOffsetメソッドをパブリックAPIに保持する場合はconst、プライベートバージョンを導入し、メソッド内からプライベートバージョンを使用する必要がありますreadSomeDataFromKnownLocation

于 2012-12-06T13:08:46.877 に答える