这样使用友元为什么出错?

sleepingboy 2003-02-26 02:56:19
VC.net下,编译错误
error C2027: 未定义类型“A”的使用

//A.h文件
#include "B.h"

class B;
class A
{
public:
A(void);
~A(void);

int get(B* pb);
};

//A.cpp
#include "a.h"

A::A(void)
{
}

A::~A(void)
{
}

//B.h文件
#include "A.h"

class A;
class B
{
public:
B(void);
~B(void);

friend int A::get(B* pb);
private:
int m_x;
};

//B.cpp文件
#include "b.h"

B::B(void)
{
m_x = 10;
}

B::~B(void)
{
}

int A::get(B* pb)
{
return pb->m_x;
}

...全文
116 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
woxihuanbohe 2003-03-15
  • 打赏
  • 举报
回复
你的头文件好多啊,估计是重复定义问题
用#ifndef A_H
#define A_H
#endif
其他头文件一样使用这个
wu_apple 2003-03-12
  • 打赏
  • 举报
回复
up
bugfree 2003-03-11
  • 打赏
  • 举报
回复
这样的类都调不通, 先读读书吧,
程序的组织太差, 该incline 不去, 不该分文件的类,却分了
唉....
pzh508 2003-03-09
  • 打赏
  • 举报
回复
to smallfool(smallfool)
是吗,但我用我上面的方法就可以很好的解决啊
smallfool 2003-03-06
  • 打赏
  • 举报
回复
好像VC6.0sp3之前的版本对友元的声明有一个BUG,具体我也说不清楚,不过,你稍微适当改变友元声明的位置,好像就可以通过了。我具体没有试过,你可以试试看。实在不行的话,下个sp3补丁上就可以了。
pzh508 2003-03-05
  • 打赏
  • 举报
回复
改成如下:
//A.h文件
//#include "B.h"//必须去掉这一句,其他的不需要更改

class B;
class A
{
public:
A(void);
~A(void);

int get(B* pb);
};

//A.cpp
#include "a.h"

A::A(void)
{
}

A::~A(void)
{
}

//B.h文件
#include "A.h"

class A;
class B
{
public:
B(void);
~B(void);

friend int A::get(B* pb);
private:
int m_x;
};

//B.cpp文件
#include "b.h"

B::B(void)
{
m_x = 10;
}

B::~B(void)
{
}

int A::get(B* pb)
{
return pb->m_x;
}

注意,如果某一个类的成员函数里面包含了另一个类的参数(就像这里类a),则只需要使用前向声明即可,而无需要包含该类的头文件.(在这里即无需要包含类b的头文件b.h)因为编译器在遇到int get(B* pb)这样的语句时,它只需要知道类B的定义即可,而前向声明就已经满足了这种条件.
但当一个类要将另一个类的成员函数(或者数据)作为友元时(在这里即是类B),就必须再包含该类的头文件,因为编译器此时不单止要知道该类的定义,而且还要知道该类的成员函数的定义,否则它不能确定该函数是否是属于该类的。
PaulZhaoPlusPlus 2003-02-27
  • 打赏
  • 举报
回复
乱七八糟
pzh508 2003-02-27
  • 打赏
  • 举报
回复
去掉b.h里面的#include "A.h"试试看,因为在这里已经有class a的前向声明,
而类b只是要类a的成员函数而已
或者就是去掉class a的前向声明而只包含#include "A.h"头文件也试试,
(我没有vc.net编译器,呵)
gyt007 2003-02-27
  • 打赏
  • 举报
回复
那位高手可以告诉正确答案啊!我调试也没有成功啊~!
riverboat 2003-02-26
  • 打赏
  • 举报
回复
就是啊,怎么看着包含关系乱七八糟的呀! ^_^
wingfiring 2003-02-26
  • 打赏
  • 举报
回复
A.h文件的
#include "B.h" 去掉。

头文件包含混乱,要好好打扫卫生:)
sleepingboy 2003-02-26
  • 打赏
  • 举报
回复
去掉头件包含后
又多了一个
error C2027: 未定义类型“B”的使用
sleepingboy 2003-02-26
  • 打赏
  • 举报
回复
int A::get(B* pb)
{
return pb->m_x;
}

放在A.cpp里后

报错
error C2027: 未定义类型“A”的使用
error C2248: “B::m_x” : 无法访问 private 成员(在“B”类中声明)
earthharp 2003-02-26
  • 打赏
  • 举报
回复
不是友元的问题
我去掉你的头文件,编译成功。
我想是多次包含
yatuor 2003-02-26
  • 打赏
  • 举报
回复

int A::get(B* pb)
{
return pb->m_x;
}

放在A.cpp里

64,682

社区成员

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

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