C++友元声明与定义依赖关系
2018-01-23 15:07
274 查看
#ifndef A_H #define A_H #include <iostream> using std::cout; using std::endl; class B;//前向声明 class A { public: void dis(const B &b);//只是一个成员函数声明,故B无需现在创建,可以用前向声明 class B; }; #endif #ifndef B_H #define B_H //class A;//因先 #include "A.h" ,再包含 #include "B.h" ,故可以省略前向声明(A已先定义) class B { private: int i; public: B(int v):i(v){} B():i(0){} //友元声明 friend void A::dis(const B &a);//其它类的成员函数作为友元函数 friend void test(const B& b);//普通的非成员函数作为友元函数 }; #endif #ifndef C_H #define C_H class C { private: int c; public: C(int v):c(v){} friend class D;//友元类,只是一个声明,不作为成员一部分,故无需先创建D的定义 }; #endif #ifndef D_H #define D_H #include <iostream> using std::cout; using std::endl; //class C;//因先 #include "C.h" ,再包含 #include "D.h" ,故此语句可以省略 class D { public: void dis(const C& c)//dis成员函数定义,这里要用到形参C,故C必须先定义完整,所以先#include "C.h" { cout<<c.c<<endl; } }; #endif #include <iostream> #include "A.h" #include "B.h" #include "C.h" #include "D.h" using namespace std; void A::dis(const B &b)//必须最后定义,因需要两个类完整定义后,才能定义该成员函数 { cout<<b.i<<endl; } void test(const B &b)//普通的非成员函数作为友元函数 { cout<<b.i<<endl; } int main() { //其他类的成员函数作为友元函数 A a; B b(9); a.dis(b); //普通的非成员函数作为友元函数 test(b); //友元类举例 C c(10); D d; d.dis(c); system("pause"); return 0; }
说明:友元的引入,为了正确地构造类,需要注意友元声明与定义之间的相互依赖。否则会导致编译出错。以上为实例代码,可以借鉴。
相关文章推荐
- 接口与实现分离:"对类声明的依赖" 取代"对类定义的依赖",类实现部分发生变动时,不需要重新编译,降低编译依赖性
- 变量声明和定义的关系
- C++ extern 变量声明与定义的关系
- -_-#【模式】声明依赖关系
- c++学习笔记之声明和定义的关系
- MVC4 违反了引用完整性约束: 在此关系的主对象和依赖对象之间,定义引用约束的属性值不一致。
- 使用spring注解方式实现组件的声明,并且用注解注入方式解决依赖关系
- C++变量声明和定义的关系
- seaJs的模块定义、模块加载及模块依赖关系
- C++中声明与定义的关系
- C++中重定义的问题——问题的实质是声明和定义的关系以及分离式编译的原理
- 变量的声明和定义的关系、extern关键字的使用
- c++变量声明与定义的关系
- Observer 在对象之间定义一个一对多的依赖关系,从而当一个对象状态发生改变时,所有依赖于这个对象的对象都能够得到通知,并对上述改变做出反应.
- UML中定义的关系主要有6种: 依赖、关联、聚合、组合/合成、泛化、实现; 以及对应的C++体现
- C++: 关于function的declaration与definition的关系(函数声明和定义的关系)(并附一篇转载文章)
- 变量声明和定义的关系
- 变量声明和定义的关系
- 通过理顺软件的依赖关系提高应用程序灵活性
- 向依赖关系宣战