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

定义一个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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值