あるべるのIT関連メモ

素人エンジニアが何かするときに困ったものなどを参考程度にメモっておこうかと

C++でprivate変数を強制的に書き換える

C++で用意されるキャストの1つreinterpret_castだが
あくまでも安全なキャストなどではなく
強制的に型情報を変換するだけで、メモリに対する防御は一切ない。

ということで、クラス内のメモリ上の変数配置が一致していれば
キャストによって他のクラスに見せかけて変数操作をすることが可能である。

class Hoge {
public:
    Hoge() : value(1) {}
    void print() { printf("%d\n", value); }
private:
    int value;
};

class HogeDummy {
public:
    RewriteValue() {
        dummy = 10;
    }
private:
    int dummy;
};

int main() {
    Hoge *hoge = new Hoge();
    HogeDummy *hogeDummy = reinterpret_cast<HogeDummy*>(hoge);

    hogeDummy->RewriteValue();    // hogeのメンバ変数valueとhogeDummyが操作するdummyはメモリ上で一致
    hoge->print();                // 10
    return 0;
}

何に使うのかは不明。
(外部ライブラリとかで無理矢理値を変更したい場合とか…あっても保守性を損なうからやらないと思うけど)