class B
{
public:
B();
~B();
void visit();
};class A
{
A();
~A();
protect:
int m_data;
B   m_b;
};A对象中成员m_b中的成员函数visit()如何修改m_data或者访问到m_data?

解决方案 »

  1.   

    把void visit() 改为  void visit(int&);
      

  2.   

    指针....知道 int m_data 为与 A 的偏移地址
    假如你知道 偏移为0x8,A 地址为*pint temp = *(int*)(p + 0x8); 就访问到了m_data
    *(int*)(p + 0x8) = 1; 则修改了m_data...
    第一次调试时 看 A的地址 就能知道 m_data位于A类的偏移...如果类没添加成员,那么这个偏移就不会变.
      

  3.   

    方法很多种,最简单的办法就是m_data做工程全局变量,呵呵!
    麻烦一点的办法如下:
    class A;//声明类,便于b知道有这个东西
    class B
    {
    public:
    A* atest;
    B(A* mm)
    atest=mm;
    ;
    ~B();
    void visit()
    {
    atest->
    }
    ;
    };class A
    {
    A();
    ~A();
    protect:
    int m_data;
    B m_b(this);
    };
    大致就是这个意思,互相包含。
    如果是头文件之间互相包含,会有问题!
    楼主可以从指针是一个long型变量来考虑如何解决两个类互相包含的问题。
      

  4.   

    请问友元函数如何做?
    如果不传参的话,B类里的成员怎么去取得包含他的A类?
    除非像4楼那样求地址来做.
    另外楼主的代码很乱,A类的构造是私有的,无法实例化,m_b成员成是保护的,外部无法访问.楼主还是把C++语法好好看看,再像2楼那样传参,才是解决问题的方向.试了一下4楼的方法,是可行的.
    class B{
    public:
    void visit(){
    *(((int*)this)-1) = 2;
    }
    };class A{
    public:
    int m_data;
    B m_b;
    };
      

  5.   

    在Class A中再写一个函数对m_data进行操作