怎样声明两个类互为友元类

xunyingren 2009-04-20 06:52:29
怎样声明两个类互为友元类
void showA(B &b){b.bi} //怎么提示error,声明了class B;不行吗,一定要看到B的定义?

#include <iostream>
using namespace std;
class B;
class A
{
friend class B;
int ai;
void showA(B &b){b.bi} //怎么提示error,声明了class B;不行吗,一定要看到B的定义?
};
class B
{
friend class A;
int bi;
void showB(A &a){a.ai}
};
void main()
{
system("pause");
}
...全文
1409 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
zenny_chen 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yingxunren 的回复:]
引用 4 楼 hairetz 的回复:
可以的,但是在看到B类完整定义前,请不要调用其方法.

这句话我不理解

我原来的例子没有调用其方法呀,只是用了B中的变量
[/Quote]

呵呵,因为在编译器尚未看到B类的定式前不知道类B有bi这个成员,所以光先声明类B后只能使用其引用或指针,
不能访问其成员或对它实例化。
ysysbaobei 2009-04-22
  • 打赏
  • 举报
回复
scsnsjsl_cs_dn 2009-04-22
  • 打赏
  • 举报
回复
学习
maosher 2009-04-22
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;
class B;
class A
{
friend class B;
int ai;
void showA(B &b);
};
class B
{
friend class A;
int bi;
void showB(A &a){a.ai}
};
void A:: showA(B &b)
{
{b.bi};
}

楼主看一下声明和定义的区别。
wjksd 2009-04-22
  • 打赏
  • 举报
回复
在声明之后,定义之前,类为不完整类型,只能用于指向该类型的指针或引用或者用于声明(不是定义)使用该类型做为形参类型或者返回类型的函数。
deerwin1986 2009-04-22
  • 打赏
  • 举报
回复
你没有定义的时候 编译器怎么知道它有什么成员啊...
insulted 2009-04-22
  • 打赏
  • 举报
回复
学习了!
ozyozy1 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hairetz 的回复:]
可以的,但是在看到B类完整定义前,请不要调用其方法.
[/Quote]

就是这个,同意
amossavez 2009-04-22
  • 打赏
  • 举报
回复 1
楼主把show放到类外面定义,而且最好是声明和实现分开放!
xunyingren 2009-04-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hairetz 的回复:]
可以的,但是在看到B类完整定义前,请不要调用其方法.
[/Quote]
这句话我不理解

我原来的例子没有调用其方法呀,只是用了B中的变量
P_ghost 2009-04-20
  • 打赏
  • 举报
回复
什么情况你需要使用互为友元的关系
eatsweetpotato 2009-04-20
  • 打赏
  • 举报
回复
void showA(B &b){b.bi} //怎么提示error,声明了class B;不行吗,一定要看到B的定义?

放在B定以后再定义

因为class B; 只是声明了一个类型,其具体的成员未知
cameracanon 2009-04-20
  • 打赏
  • 举报
回复
如果你用C++,我认为,最好的方法是其中一个类做成模板类
#include <iostream>

using namespace std;

class B;

template<class T>class A
{

public:
void showA(int ai)
{ T* pT=(T*)this;pT->showB(b.bi);}
};

typedef class A<B> clsAB;

class B :public clsAB
{
public:
void showB(int bi)
{ T* pT=(T*)this;pT->showA(a.ai);}

};

int main(int argc, char* argv[])
{
system("pause");
}

wxfasdic_12 2009-04-20
  • 打赏
  • 举报
回复
同意楼上的说法,最稳妥。
  • 打赏
  • 举报
回复
可以的,但是在看到B类完整定义前,请不要调用其方法.
  • 打赏
  • 举报
回复
#include <iostream> 
using namespace std;
class A
{
friend class B;
int ai;
void showA(B &b); //怎么提示error,声明了class B;不行吗,一定要看到B的定义?
};
class B
{
friend class A;
int bi;
void showB(A &a);
};


void A::showA(B &b)
{b.bi;}
void B::showB(A &a){a.ai;}



int main()
{


return 0;
}
zenny_chen 2009-04-20
  • 打赏
  • 举报
回复
的确是这样,必须看见class B的完整定义

#include <iostream>
using namespace std;
class B;
class A
{
friend class B;
int ai;
void showA(B &b);
};

class B
{
friend class A;
int bi;
void showB(A &a){a.ai}
};
void main()
{
system("pause");
}

//将定义放于此即可
void A::showA(B &b)
{
b.bi;
}
fallening 2009-04-20
  • 打赏
  • 举报
回复
分开放置,声明放一个头文件(.h),实现放另一个文件(.cpp)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧