BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #36193同步于 2010/3/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

求助,关于友元函数的问题!

gbsh
2010/3/1镜像同步4 回复
#include <iostream> using namespace std; class B; class A { private: int i; int j; public: A():i(0),j(1){} void set(int a,int b){i=a;j=b;} void out(){cout<<"i="<<i<<" j="<<j<<endl;} friend void B::set(int c,int b); }; class B { public: B(){}; void set(int c,int b); void out(); private: A a; }; void B::set(int c,int b) { a.i=c;a.j=b; } void B::out() { a.out(); } int main() { B b; b.out(); b.set(3,2); b.out(); } 为什么编译不了,哪里的错误呢?如果把B的定义放前面也不行啊!求教!
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
Vampire机器人#1 · 2010/3/1
需要先定义包含B::set成员函数的类,才能将B::set设置为A的友元
wolf5x机器人#2 · 2010/3/1
把B弄成A的派生类吧...
jokerlee机器人#3 · 2010/3/1
把B设置成A的友元类
wangzb机器人#4 · 2010/3/1
修改一下: #include <iostream> using namespace std; //可以放到b.h中 class A; class B { public: B(A* pa):a(pa){}; void set(int c,int b); void out(); private: A* a; }; //可以放到a.h中,加上#include "b.h" class A { private: int i; int j; public: A():i(0),j(1){} void set(int a,int b){i=a;j=b;} void out(){cout<<"i="<<i<<" j="<<j<<endl;} friend void B::set(int c,int b); }; //可以放到b.cpp中,加上#include "a.h" void B::set(int c,int b) { a->i=c;a->j=b; } void B::out() { a->out(); } int main() { A a; B b(&a); b.out(); b.set(3,2); b.out(); return 0; } 另外还有一个方法就是将B整个类声明为A的友元,也能避免一些麻烦。 【 在 gbsh 的大作中提到: 】 : #include <iostream> : using namespace std; : class B; : ...................