加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 22:27:05 所属栏目:百科 来源:网络整理
导读:定义一个CBottle类,另一个类CCarton的某个成员对CBottle进行操作,因此在CBottle类中赋予CCarton成员的友元权利。我们很容易写出如下代码: //CBottle类的头文件 bottle.h#include "carton.h"class CCarton;class CBottle{public:CBottle(double height,dou

定义一个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);
};<pre name="code" class="cpp">//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);
};<pre name="code" class="cpp"><pre name="code" class="cpp"><pre name="code" class="cpp"><pre name="code" class="cpp">//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;
};
<pre name="code" class="cpp"><pre name="code" class="cpp">//CCarton类的源文件  carton.cpp
#include <iostream>
#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 successnn";
}
<pre name="code" class="cpp"><pre name="code" class="cpp">//主函数 main.cpp
#include<iostream>
#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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读