最近在改一个C++程序的时候碰到一条警告信息,警告信息为:“

删除指向不完整“Q2DTorusNode”类型的指针;没有调用析构函数
                1> c:\users\lxw\desktop\dragonfly第二阶段实验\最终的实验版本\实验目录\dragonfly_modify\src\Q2DTorus.h(6) : 参见“Q2DTorusNode”的声明

警告信息很是奇怪,其实出于强迫症的原因想要解决掉这个警告信息,而且从警告信息来看,程序也应该存在内存泄露的问题,因为警告直接明白告诉你了,没有调用析构函数,接下来就是我解决的过程。我会搭建一个简单的程序来模拟这个错误,因为程序是在有些多~

警告的来源:

一个头文件A.h包含class A的代码如下:

#ifndef AH
#define AH
class B;
class A {B *memb;A() {}~A() {delete memb;}
};
#endif

  一个头文件B.h包含class B的代码如下:

#ifndef BH
#define BH
class B {};
#endif

     此时编译就会产生类似上面的警告信息:warning C4150: 删除指向不完整“B”类型的指针;没有调用析构函数。

原因分析:

   因为class A中B的声明依赖于class B的前置声明,而不是#include "B.H",所以B的定义对A来说不可见,所以无法调用析构函数,导致内存泄露。

程序的变化

此时如果class A和class B相互保持对方类型的成员会如何呢?

A.h的代码:

#ifndef AH
#define AH
class B;
class A {B b;
};
#endif

   B.h的代码:

#ifndef BH
#define BH
#include "A.h"
class B {A a;
};
#endif

  这段代码存在问题,因为如果静态定义对象A,B,此时必定存在一个对象的定义对于另外一个对象的定义不可见,所以定义失败。如果均是利用#include对方,取决于编译器的顺序必定一个定义不可见。然而前置声明不能定义对象。

解决方案:

此种状况的解决利用前置声明定义的那个类中的保持另外一个类的引用定义为指针,定义指针时不需要对那个类的定义可见。

另外的问题:

A.h

#ifndef AH
#define AH
class B;
class A {B* b;void setB() {b->haha();}~A() {delete b;}
};
#endif 

B.h

#ifndef BH
#define BH
#include "A.h"
class B {A a;void haha() {}
};
#endif

但是利用前置声明导致定义指针成员的类会出现最开始说的warning警告,因为定义不可见的原因。

“warning C4150: 删除指向不完整“B”类型的指针;没有调用析构函数”

而且另外的一个问题是在该.h文件中不能使用该指针调用这个类的成员,原因也是定义不可见。

“error C2227: “->haha”的左边必须指向类/结构/联合/泛型类型”

解决方案:

此时需要将A.h的所有成员函数实现重新定义一个.cpp文件,然后该.cpp文件去#include 指针成员类的头文件声明,此时定义可见,即可定义析构函数,调用指针的类成员了。

A.h

#ifndef AH
#define AH
class B;
class A {
public:B* b;void setB();~A();
};
#endif

  

B.h

#ifndef BH
#define BH
#include "A.h"
class B {
public:A a;void haha() {}
};
#endif

  

A.cpp

#include "A.h"
#include "B.h"
A::~A() {delete b;
}
void A::setB() {b->haha();
}

  

问题到此就解决完毕了~

c++中两个类互相引用的问题相关推荐

  1. Cocos Creator两个类相互引用(调用)

    如果两个类相互引用,脚本加载阶段就会出现循环引用,循环引用将导致脚本加载出错: ///Game.js var Item = require("Item"); var Game = ...

  2. C++中两个类中互相包含对方对象的指针问题

    前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某一个类未定义...所以我就想啊想,这样也对,我的头文件都有#ifndef的,包含了一次就不能再包含了,以为就实现不了这样的功能,于是 ...

  3. cocos 时间函数需要什么引用_Cocos Creator两个类相互引用(调用)

    如果两个类相互引用,脚本加载阶段就会出现循环引用,循环引用将导致脚本加载出错: ///Game.js var Item = require("Item"); var Game = ...

  4. C++两个类互相引用的做法

    1.简单采取前向引用 我们知道C++的类应当是先定义,然后使用.但在处理相对复杂的问题.考虑类的组合时,很可能遇到俩个类相互引用的情况,这种情况称为循环依赖. 例如: class A {public: ...

  5. java中两个类怎么解决_导入两个具有相同名称的类。如何处理?

    问题 说我有一个像这样的代码: import java.util.Date; import my.own.Date; class Test{ public static void main(Strin ...

  6. C++中没有定义类的引用。

    在有时候由于类太大.须要在类在后面定义: 比如: class Y{void f(X); }; class X{ //一些成员数据和函数}; //error 由于c++要求不论什么一个变量在引用之前必须 ...

  7. java不同类间调用数组_请问:JAVA中两个类中的方法都需要调用另一个类的数组进行对数组的初始化和调用。...

    匿名用户 1级 2013-09-14 回答 import java.util.ArrayList; import java.util.Iterator; import java.util.List; ...

  8. 【C++】两个类的相互引用

    有时候在设计数据结构的时候,可能会遇到两个类需要相互引用的情形.比如类A有类型为B的成员,而类B又有类型为A的成员. 那么这种情形下,两个类的设计上需要注意什么呢? 同一文件 尝试方案 将A和B的定义 ...

  9. 两个类相互包含引用的问题--类前向声明

    在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A {     int i;     B b; } clas ...

最新文章

  1. RxJava 2.x 使用最佳实践
  2. 部署 Communicator Web Access
  3. webapi文档描述-swagger
  4. 开始→运行→命令 总结大全
  5. dotNET Core:编码规范
  6. jsp文件通常用common_springboot还能这样用redis
  7. 软件导航html单页源码
  8. sprintf 函数
  9. css3的高级而有用且很少人知道的属性和样式
  10. hdu 3951 博弈
  11. Raki的读paper小记:ALBERT: A LITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS
  12. knx智能照明控制系统电路图_智能照明控制系统KNX
  13. SpringBoot整合elasticsearch (java整合es)
  14. Vue前端项目-用户管理-条件搜索界面
  15. 从人机交互到人机协作,人类在抑制 AI 时代的焦虑时做的尝试
  16. php编辑菱形图案代码,打印菱形图案 (15 分)
  17. Apache Doris三种数据模型(Aggregate、Uniq、Duplicate)的使用及其注意点
  18. 【android】 如何把gif图片下载到本地
  19. Windows文件夹文件目录自动生成器
  20. 微信内置浏览器清除缓存解决方案(实测有效)

热门文章

  1. JavaScript疑难杂症系列-事件循环
  2. [洛谷P2057][SHOI2007]善意的投票
  3. 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格
  4. 三座”大山“或让谷歌无人机送货项目被冻结
  5. HDU 1557 权利指数 国家压缩 暴力
  6. 吴世春:如何找到产品的引爆点
  7. update操作报错
  8. Python 之vim编写python自动补全
  9. 使用Windows8开发Metro风格应用三
  10. 死磕 java集合之TreeMap源码分析(一)——红黑树全解析