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

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;
}

...全文
69 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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里
回复
发动态
发帖子
C++ 语言
创建于2007-09-28

5.9w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
社区公告
暂无公告