为什么调用不了友元函数如何调用类里的函数,求大神 帮忙改下代码??

试着把定义友元类的例子改为定义友元函数,为什么会出错呢【c++吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:289,003贴子:
试着把定义友元类的例子改为定义友元函数,为什么会出错呢收藏
#include&iostream.h&class F2;//原例没有这个声明,是为了下面的改动而加的class F1{private: friend F2::F2(F1 *x);//原例为:friend class F2; friend int main(void); F1() {var=300;}};class F2{ int var2;public: F2(F1 *x) {var2=x-&} int GetVar() {return var2;}};int main(void){ F1 f1; F2 f2(&f1);
x=f2.GetVar(); cout&&x&& return 0;}如上。本菜刚自学到友元那儿。我试着把书上的一个定义友元类的例子改了两处,改动如上,就是想通过定义友元函数达到同样的效果。改动前用vc++6编译无误。改完之后一编译,调试窗口显示一堆错误- -很多还看不懂……网上找了下,看来不是构造函数不能为其它类的友元之类的毛病,于是只好来这了……还求各位路过大神看一看,哪里不对了请随便喷吧,指出来了就好。耽误各位时间这里谢过了先~
达内c++培训,0基础,从入门到精通只需120天,可就业后付款,签订c语言就业协议,c++培训,首选达内,美国上市公司,靠谱,值得信赖!
函数是要有返回类型的骚年
这回不把构造函数定义为友元了,而是新增一个函数,可还是有错……#include&iostream.h&class F2;class F1{
friend int F2::copy(F1 *x);//错误是:use of undefined type 'F2'public:
F1() {var=300;}};class F2{
int copy(F1 *x) {return x-&}public:
F2(F1 *x) {var2=copy(F1 *x);}
int GetVar() {return var2;}};int main(void){
F2 f2(&f1);
x=f2.GetVar();
return 0;}奇怪啊,不是define了吗……为什么会提示undefine呢……那个友元主函数倒是去掉了……太纠结了,还不如直接定义友元类的好,感觉像在自虐……
构造函数这句 F2(F1 *x) {var2=copy(F1 *x);}
函数体中是不是应该用x
今天我也正好看到友元这 帮你仔细看了一下 问题的关键 是在类的声明上 类的声明的作用很有限声明类后只说明有这个类 类具体有什么样的数据成员,有什么样的成员函数都是未定义friend int F2::copy(F1 *x);//错误是:use of undefined type 'F2'所以这一句就出错了 只声明了F2的类型 但没有定义过copy这个函数 声明友元的话 至少函数得先存在
具体解决办法如下:首先将F1和F2换一下位置,声明也要改成F1。class F1;class F2{int var2;int copy(F1 *x) {return x-&}public:F2(F1 *x) {var2=copy(F1 *x);}int GetVar() {return var2;}};class F1{friend int F2::copy(F1 *x);public:F1() {var=300;}};这样一来,在声明友元函数时,friend int F2::copy(F1 *x);,copy函数确实已经存在了。
然后出现新的问题int copy(F1 *x) {return x-&}道理和之前相同,class F1;只是告诉系统有F1这么个类型,但没有告诉系统他有什么样的数据成员,所以系统无法识别var。解决办法是,在类内仅仅只做声明int copy(F1 *x);函数体部分在类外定义,在F2完整声明之后,再定义copy的函数体,这时系统能识别var了。
最后还有个小问题int copy(F1 *x) {return x-&}F2的构造函数要通过copy来获得数据,那么copy应该是public,而不是默认的private完整代码如下:#include&iostream& class F1; class F2{ int var2;public: int copy(F1 *x);
F2(F1 *x) {var2=copy(x);} int GetVar() {return var2;}}; class F1{ friend int F2::copy(F1 *x);public: F1() {var=300;}}; int F2::copy(F1 *x) {return x-&} int main(void){F1 f1;F2 f2(&f1);x=f2.GetVar();cout&&x&&return 0;}
打字打的我手都酸了 少年 如果运行通过记得好好谢谢我
:对对对!就是顺序的问题!我照着你说的把声明和定义的顺序调了一下然后编译通过!哈谢谢哈~~另外,那个copy函数,因为是被本类自己的构造函数调用的,所以不需要声明为public,我用private声明确实可以完成编译总之谢谢了哈~我本来都打算不管了的……
c++多少钱?万和专注it教育24年,优秀的师资团队,雄厚的教学环境,赢得数万学子的好评,万和24年不开分支机构,只为专注教学品质,传承万和不朽品牌!
登录百度帐号推荐应用

我要回帖

更多关于 友元函数类外定义 的文章

 

随机推荐