C / C ++の黒魔術 - 私有財産への無制限アクセス

C ++は、主に誤用を避け、メンテナンスコストを削減するために、プライベートメンバーや機能の可視性を制限するために使用されます。

  一部の人々が考える、鉱山は私のものです、あなたは、私は私がしたいと思わないと思います。直接プライベートメンバにアクセスしてもいない場合、私はまた、アクセスする他の方法を見つける必要があります。それは私有財産へのアクセス権を持っているものの方法を見てみましょう。

パラメータをコンパイルすることによりオープン

-fno-access-controlGCCコンパイラオプションは、あなたが直接、プライベートプロパティにアクセスするための扉を開くことができます。主ユニットテストのために使用

オブジェクトがアクセスするアドレスオフセット

  C ++オブジェクトは、ポインタの配列と見なすことができます。ポインタの配列をに格納されたオブジェクトと仮想関数テーブルデータメンバのアドレスそれは配列へのポインタであるため、当然のことながら、ことができるアクセスする任意のメンバは、ポインタを介してオブジェクト例として:

class Test
{
public:
    void print()
    {
        printf("%d %d %d\n", m_a, m_b, m_c);
    }

private:
    int m_a;
    int m_b;
    int m_c;
};

int main(int argc, char *argv[])
{
    Test t;
    int *a = (int *)&t+0; /* m_a的地址 */
    int *b = (int *)&t+1; /* m_b的地址 */
    int *c = (int *)&t+2; /* m_c的地址 */
    *a = 10;
    *b = 20;
    *c = 30;

    t.print();
	return 0;
}

  出力:

10 20 30

マクロ置換を使用してください

  次のマクロを使用してprivate置き換えキーワードpublicアクセス私有財産への扉を開くために。

#define private public

いくつかの視点

  一部の人々は、プログラムにそのクラスの存在を認めたため、民間、そのクラスのパブリック、保護は、生活の中で物事をシミュレートすることができます考えているようです。Qtの6月には、主に無差別にユーザを制限するために、アクセスのレベルを作成する理由、それは、真実ではないと考えています。しかし、たとえこの機構を無差別Jiabu朱ユーザーを理解することはありません。

世間の注目いいえQtの6月、最新のプッシュは初めて。

公開された354元の記事 ウォン称賛80 ビュー15万+

おすすめ

転載: blog.csdn.net/nicai_xiaoqinxi/article/details/103774908