C++プライベートメンバー関数へのアクセス方法


私が知っているのは3つの方法です.
  • は、アドレスを介して
  • にアクセスする.
  • 友元関数
  • を通過
  • 友元類
  • を通過
    2つ目と3つ目は比較的一般的な方法で、1つ目はあまり一般的ではないかもしれません.
    一、アドレスによるアクセス
    この方法は,クラスの保存メカニズムであればクラス内にメンバー変数と虚関数しかないので,アドレスを用いてアクセスできる.
    つまり
    A a;*((int*)&a);実現する
    まずaのアドレスを取り出し、int型のアドレスに変換し、最後に解で値に参照します.
    #include
    using namespace std;
    
    class A
    {
    public:
    	A()
    	{
    		a = 1;
    		b = 2;
    		c = 3;
    	}
    private:
    	int a;
    	int b;
    	int c;
    };
    int main()
    {
    	A a;
    
    	int b = *((int*)&a);
    	cout << b << endl;
    	int b2 = *((int*)&a+1);
    	cout << b2 << endl;
    	int b3 = *((int*)&a+2);
    	cout << b3 << endl;
    	
    	system("pause");
    	return 0;
    }

    二、友元関数を通過する
    関数をクラスの友元として宣言すると、クラスは関数を自分の人として扱い、クラスのプライベートメンバー変数に直接アクセスできます.
    #include
    using namespace std;
    
    class A
    {
        void friend show();
    public:
    	A(){ a = 1; }
    private:
    	int a;
    };
    
    void show()
    {
    	A a;
    	cout << a.a << endl;
    }
    int main()
    {
    	show();
    	system("pause");
    	return 0;
    }

    三、友元類を通じて
    上記と同様に、クラスとして宣言された友元であり、友元クラスはクラスのプライベートメンバー変数にアクセスできます.
    #include
    using namespace std;
    
    class A;
    
    class B
    {
    	friend A;
    public:
    	B(){ a = 1; }
    private:
    	int a;
    };
    
    class A
    {
    public:
    	void show()
    	{
    		B b;
    		cout << b.a << endl;
    	}
    };
    
    int main()
    {
    	A a;
    	a.show();
    	system("pause");
    	return 0;
    }