autodataming的个人博客分享 http://blog.sciencenet.cn/u/autodataming

博文

c++: 2个类相互引用

已有 2379 次阅读 2015-12-19 16:55 |个人分类:c++|系统分类:科研笔记

refer:

1 http://blog.sina.com.cn/s/blog_6e04a8350100sonp.html

2 http://blog.csdn.net/a117653909/article/details/6719021

3 http://blog.chinaunix.net/uid-20761674-id-3155498.html

4 http://www.cnblogs.com/MuyouSome/p/3388242.html

----------------------

类相互包含,很头疼,A 中有B,B中有A。 因为在A对象中要开辟一块属于B的空间,而B中又有A的空间,是一个逻辑错误,无法实现的。

-----A.h----------------

#include "B.h"

class A{      public:          B b;};

------B.h---------------------

#include "A.h"

class B{      public:          A a;};


--------------

这样的话,首先#include 不停的循环暂开,

你可能会想到ifndef机制,或者pragma once机制

----展开成这样-----------

class B{      public:          A a;};

class A{      public:          B b;};

-----

b.a.b.a.b.a.b......

很有点子子孙孙无穷尽之状

-----------------------------------------

两者的定义,至少有一方是使用指针,或两者都使用指针,但是决不能两者都定义实体对象。



-------------

因为C++编译器自上而下编译源文件的时候 ,这个概念非常重要!!!



--------------

在一些大的工程中,可能会包含几十个基础类,免不了之间会互相引用 ( 不满足继承关系,而是组合关系 ) 。

编码时,我们一般会尽量避免 include 头文件,而是采用声明 class XXX 。 但有时候还是必须用 Include 头文件,那么,两者的划分在于什么呢?


二:一般原则:
a. 头文件中尽量少 include, 如果可以简单申明 class clsOld; 解决,那最好。减少没有必要的 include;
b. 实现文件中也要尽量少 include, 不要 include 没有用到的头文件。


三:那什么时候可以只是简单声明 class clsOld 呢?
简单的说:不需要知道 clsOld 的内存布局的用法都可以 ( 静态成员除外 ) ,也就是讲如果是指针或引用方式的 都行。
比如:
  clsOld * m_pOld;    // 指针占 4 个字节长
  clsOld & test(clsOld * pOld) {return *pOld};
 一切 OK 。



 



https://wap.sciencenet.cn/blog-950202-944500.html

上一篇:各种编码各种好用的网络小工具
下一篇:drugpocket: c++ 线段和球的交点

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2021-9-17 19:25

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部