定义一个CBottle类,另一个类CCarton的某个成员对CBottle进行操作,因此在CBottle类中赋予CCarton成员的友元权利。我们很容易写出如下代码:

//CBottle类的头文件 bottle.h

#include "carton.h"

class CCarton;

class CBottle{

public:

CBottle(double height,double diameter):m_Height(height),m_Diameter(diameter){

}

private:

double m_Height;

double m_Diameter;

friend CCarton::CCarton(const CBottle& aBottle);

};

//CCarton类的头文件  carton.h

#include "bottle.h"

class CBottle;

class CCarton{

public:

CCarton(const CBottle& aBottle){

m_Height = aBottle.m_Height;

m_Length = 4.0 * aBottle.m_Diameter;

m_Width = 3.0 * aBottle.m_Diameter;

}

private:

double m_Height;

double m_Length;

double m_Width;

};

//主函数所在文件 main.cpp#include "carton.h"#include "bottle.h"int main(){CBottle aBottle(10,20);CCarton aCarton(aBottle);return 0;}

运行结果显示出错,因为在执行bottle.h时,遇到的第一条语句就是#include "carton.h",跳转到"carton.h“文件(此时"bottle.h”文件还没有执行完,即还没有执行成功),而"carton.h"文件的第一条语句是#include "bottle.h",编译器又跳转到"bottle.h",以至于depth=1024,编译器陷入死循环。之所以出现这种情况,是由于两个头文件之间的互相包含,如果只有一个包含另一个的话,则编译器可顺利通过。我们改动“carton.h"文件,因为”carton.h"中CCarton的构造函数使用CBottle类的具体对象,因此必须包含"bottle.h“如果我们只是声明CCarton的构造函数,而不具体实现构造函数,则不需要#include "bottle.h",我们将CCarton构造函数的实现放在carton.cpp中,这样编译器则可以预处理两个.h文件。

//CBottle类的头文件 bottle.h

#pragma once

#include "carton.h"

class CCarton;

class CBottle{

public:

CBottle(double height,m_Diameter(diameter){

}

private:

double m_Height;

double m_Diameter;

friend CCarton::CCarton(const CBottle& aBottle);

};

//CCarton类的头文件  carton.h

#pragma once

//#include "bottle.h"

class CBottle;

class CCarton{

public:

CCarton(const CBottle& aBottle);

private:

double m_Height;

double m_Length;

double m_Width;

};

//CCarton类的源文件  carton.cpp

#include

#include "carton.h"

#include "bottle.h"

CCarton::CCarton(const CBottle& aBottle){

m_Height = aBottle.m_Height;

m_Length = 4.0 * aBottle.m_Diameter;

m_Width = 3.0 * aBottle.m_Diameter;

std::cout << "Carton constructor success\n\n";

}

//主函数 main.cpp

#include

#include "carton.h"

#include "bottle.h"

using namespace std;

int main(){

CBottle aBottle(10,20);

CCarton aCarton(aBottle);

system("pause");

return 0;

}

注意:这种情况下一定要加上#pragma once,因为头文件的包含关系和类的前置声明,很容易出现类的重定义。而#pragma once指令确保在编译过程中类的定义只能出现一次。

类似地,关于类的依赖关系,后面这篇文章讲的很好,可以挂在这里

(C++中前置声明的应用与陷阱 点击打开链接http://blog.csdn.net/yunyun1886358/article/details/5672574)

相关文章

总结

以上是编程之家为你收集整理的友元类成员的依赖关系|循环依赖全部内容,希望文章能够帮你解决友元类成员的依赖关系|循环依赖所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

java中友元类_友元类成员的依赖关系|循环依赖相关推荐

  1. java 为什么有匿名类_全面了解Java中的内部类和匿名类

    Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了 ...

  2. Java Review - 并发编程_原子操作类LongAdder LongAccumulator剖析

    文章目录 概述 小Demo 源码分析 重要的方法 long sum() reset sumThenReset longValue() add(long x) longAccumulate(long x ...

  3. C# - 类_使用新成员隐藏基类成员

    1 using System; 2 3 namespace 类_使用新成员隐藏基类成员 4 { 5 // 基类 : Animal 6 public class Animal 7 { 8 // 基类的普 ...

  4. JAVA中同目录下定义类,以及对象的创建与使用,内存图的原理

    JAVA中同目录下定义类,以及对象的创建与使用(听课笔记) JAVA中对象的创建与使用(听课笔记) 示例一 同文件目录下,创建了三个类OOTest01,User,Address类,之间的调用 示例二 ...

  5. java urlencoder,java中的URLEncoder和URLDecoder类

    java中的URLEncoder和URLDecoder类 URLEncoder类包含将字符串转换为application/x-www-form-urlencoded MIME 格式的静态方法. 为了解 ...

  6. Java 中的线程安全的类

    Java 中的线程安全的类 3 个线程安全的类 它们对应的非线程安全的类 它们延伸的类 其它 它们对应的非线程安全的类 3 个线程安全的类   Java 中的 3 个基本的线程安全的类为:Hashta ...

  7. java中常用的包、类、以及包中常用的类、方法、属性----sql和text\swing

    java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.sql.*; java.text.*; java.a ...

  8. java面试题27 java中下面哪些是Object类的方法()

    java面试题27 java中下面哪些是Object类的方法() A notify() B notifyAll() C sleep() D wait() 蒙蔽树上蒙蔽果,蒙蔽树下你和我.遇到这种题,我 ...

  9. jAvA中deprecate,在Java中使用Deprecated方法或类是错误的吗?

    1.在Java中使用Deprecated方法或类是错误的吗? 从已弃用的定义 : 注释@Deprecated的程序元素是程序员不鼓励使用的程序元素,通常是因为它是危险的,或者是因为存在更好的selec ...

最新文章

  1. python 列表表达式 if_python中if else如何判断表达式成立?
  2. [ Luogu 3924 ] 康纳的线段树
  3. uva 11212 Editing a Book
  4. jQuery基础之(一)jQuery概述
  5. Python的内存管理、命名规则、3个特性讲解
  6. 电脑卡顿不流畅怎么解决_如何解决因电脑内存容量不足引起的卡顿?
  7. 关于jsp中jstl-core标签循环遍历的使用
  8. GPUImage组合滤镜
  9. R语言软件和RStudio环境的下载与安装
  10. Tomcat-线程模型及设计精髓
  11. EN300328测试软件,蓝牙耳机EN300328测试项目。
  12. 自定义插入页面标签以及实现类似通讯录的首字母搜索
  13. China Joy 还没看够?2020 谷歌游戏出海峰会带来更多精彩!
  14. Ariane和riscv-gnu-toolchain工具链的安装
  15. 【Python基础】3-语法进阶
  16. solidwork放置螺丝孔以及显示螺纹的问题
  17. 如何用光盘映像文件重装服务器系统,最简单的重装系统方法,直接使用ISO镜像,U盘PE系统统统不需要!-光盘映像文件怎么安装...
  18. LowRankGAN
  19. 如何使用Visual Studio 2005画一张正规的国旗图片
  20. 湛江C语言培训,湛江c语言编程学习,湛江学c语言编程报班,湛江学c语言编程自学好还是报班好...

热门文章

  1. Design Pattern Explained 读书笔记二——设计模式序言
  2. groupby elasticsearch
  3. java校验字符串是否为json格式
  4. 偏移量详解-源自csna 菜鸟飞人
  5. 远程备份SQL Server 2005数据库
  6. 个人所得税计算,计算器.
  7. sitemesh排除装饰action的心得
  8. 服务发现存储仓库 etcd 使用简介
  9. python3 uvloop 简介
  10. linux inotify-tools 监控文件变化