C++两个类如何通过指针相互调用对方的函数?

代码如下,编译提示m_pB->funB();这句有错误,怎么改?多谢~#include<iostream>classA;classB;classA{B*m_pB;publ... 代码如下,编译提示m_pB->funB();这句有错误,怎么改?多谢~
#include <iostream>
class A;
class B;
class A
{
B* m_pB;
public:
A()
{
m_pB=nullptr;
}
void Set(B* pB)
{
m_pB=pB;
}
void funA()
{
std::cout<<"类A的funA被调用"<<std::endl;
m_pB->funB();
}
};

class B
{
A* m_pA;
public:
B()
{
m_pA=nullptr;
}
void Set(A* pA)
{
m_pA=pA;
}
void funB()
{
std::cout<<"类B的funB被调用"<<std::endl;
m_pA->funA();
}
};

int main()
{
A a;
B b;
a.Set(&b);
b.Set(&a);
a.funA();
b.funB();
return 0;
}
展开
 我来答
reverse_walker
2013-11-27 · TA获得超过590个赞
知道小有建树答主
回答量:377
采纳率:0%
帮助的人:465万
展开全部
交叉引用一般有两种方法
class B ;
class A
{
B* pb ;
void funA() ;
} ;

class B
{
A* pa ;
void funB() ;
}

void A::funA() { pb->funB() ; } // warning of infinite loop here
void B:: funB() { pa->funA() ; } // warning of infinite loop here
这是最常见的方式
------------------------------------------------
但上面方式有个严重的缺陷, 必须要把类的定义和实现分开.这就意味着,
你不能类的实现放在.h中(并被多个.cpp包含), 不然就等着编译器在链接时抱怨"符号重定义"
因为类的定义作用域是单模块, 而函数的定义是扩模块的.
我平时写类库, 最怕的就是为个.h要写个.cpp,文件,太繁琐.

所以可以使用方法2
template< class B >
class A
{
B* pb ;
void funA() { pb->funB() ; } // warning of infinite loop here
} ;

class B
{
A* pa ;
void funB() { pa->funA() ; } // warning of infinite loop here
}
这种C++ idiom虽然说要让A引入策略B做为模板参数, 有些"做作"
但是交叉引用这种设计很多时候隐含着, 你的class A确实需要依赖策略B中的语义.
所以模板并不是单纯解决"双重引用"这个机制而诞生的, 而是class A在概念上对于策略B的自然依赖. 只是策略B除了用class B初始化, 还可以用其他类初始化
yzviolet
2013-11-27 · TA获得超过2578个赞
知道大有可为答主
回答量:1196
采纳率:0%
帮助的人:1000万
展开全部

需要完整的类声明。就是正常的头文件的作用了。

#include <iostream>

class A;
class B
{
    A *m_pA;
public:
    B();
    void Set(A *pA);
    void funB();
};

class A
{
    B* m_pB;
public:
    A()
    {
        m_pB=nullptr;
    }
    void Set(B* pB)
    {
        m_pB=pB;
    }
    void funA()
    {
        std::cout<<"类A的funA被调用"<<std::endl;
        m_pB->funB();
    }
};

B::B()
{
    m_pA=nullptr;
}
void B::Set(A* pA)
{
    m_pA=pA;
}
void B::funB()
{
    std::cout<<"类B的funB被调用"<<std::endl;
    m_pA->funA();
}

int main()
{
    A a;
    B b;
    a.Set(&b);
    b.Set(&a);
    a.funA();   // 这里就退不出来了。互相调用一直循环在里面。
    b.funB();
    return 0;
}

顺便说,你这程序这样写会死循环。a.funA 里面调用 m_pB->funB,而 b的funB 里又调用 m_funA。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
浪迹天涯的流星
2015-11-12 · 知道合伙人教育行家
浪迹天涯的流星
知道合伙人教育行家
采纳数:8922 获赞数:81537
对于基本办公软件比较擅长。

向TA提问 私信TA
展开全部
交叉引用一般有两种方法
class B ;
class A
{
B* pb ;
void funA() ;
} ;

class B
{
A* pa ;
void funB() ;
}

void A::funA() { pb->funB() ; } // warning of infinite loop here
void B:: funB() { pa->funA() ; } // warning of infinite loop here
这是最常见的方式
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友c35996c7e
2013-11-27 · 超过52用户采纳过TA的回答
知道小有建树答主
回答量:129
采纳率:0%
帮助的人:158万
展开全部
#include <iostream>
//class A;
class B;
class A
{
B* m_pB;
public:
A()
{
m_pB = nullptr;
}
void Set(B* pB);
void funA();
};

class B
{
A* m_pA;
public:
B()
{
m_pA = nullptr;
}
void Set(A* pA);
void funB();
};

void A::Set(B* pB)
{
m_pB = pB;
}

void A::funA()
{
std::cout << "类A的funA被调用" << std::endl;
m_pB->funB();
}

void B::Set(A* pA)
{
m_pA = pA;
}

void B::funB()
{
std::cout << "类B的funB被调用" << std::endl;
m_pA->funA();
}

int main()
{
A a;
B b;
a.Set(&b);
b.Set(&a);
a.funA();
b.funB();
return 0;
}

你这个程序会永无止境的循环调用下去,自己编译运行看看效果吧。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
regret4hxp2
2013-11-27 · TA获得超过682个赞
知道小有建树答主
回答量:479
采纳率:100%
帮助的人:249万
展开全部
那是因为在此处。B类还没有定义,只有前向声明。所以只能使用B的指针,而不能使用B的对象中的任何成员。

修改你的逻辑吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式