最近在改乙個c++程式的時候碰到一條警告資訊,警告資訊為:「
刪除指向不完整「q2dtorusnode」型別的指標;沒有呼叫析構函式
1> c:\users\lxw\desktop\dragonfly第二階段實驗\最終的實驗版本\實驗目錄\dragonfly_modify\src\q2dtorus.h(6) : 參見「q2dtorusnode」的宣告
」警告資訊很是奇怪,其實出於強迫症的原因想要解決掉這個警告資訊,而且從警告資訊來看,程式也應該存在記憶體洩露的問題,因為警告直接明白告訴你了,沒有呼叫析構函式,接下來就是我解決的過程。我會搭建乙個簡單的程式來模擬這個錯誤,因為程式是在有些多~
乙個標頭檔案a.h包含class a的**如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef ah
#define ah
class
b;
class
a
~a()
};
#endif
乙個標頭檔案b.h包含class b的**如下:
1
2
3
4
5
6
#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的**:
1
2
3
4
5
6
7
#ifndef ah
#define ah
class
b;
class
a ;
#endif
b.h的**:
1
2
3
4
5
6
7
#ifndef bh
#define bh
#include "a.h"
class
b ;
#endif
這段**存在問題,因為如果靜態定義物件a,b,此時必定存在乙個物件的定義對於另外乙個物件的定義不可見,所以定義失敗。如果均是利用#include對方,取決於編譯器的順序必定乙個定義不可見。然而前置宣告不能定義物件。
解決方案:
此種狀況的解決利用前置宣告定義的那個類中的保持另外乙個類的引用定義為指標,定義指標時不需要對那個類的定義可見。
另外的問題:
a.h 1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef ah
#define ah
class
b;
class
a
~a()
};
#endif
b.h 1
2
3
4
5
6
7
8
9
10
#ifndef bh
#define bh
#include "a.h"
class
b
};
#endif
但是利用前置宣告導致定義指標成員的類會出現最開始說的warning警告,因為定義不可見的原因。
「warning c4150: 刪除指向不完整「b」型別的指標;沒有呼叫析構函式」
而且另外的乙個問題是在該.h檔案中不能使用該指標呼叫這個類的成員,原因也是定義不可見。
「error c2227: 「->haha」的左邊必須指向類/結構/聯合/泛型型別」
解決方案:
此時需要將a.h的所有成員函式實現重新定義乙個.cpp檔案,然後該.cpp檔案去#include 指標成員類的標頭檔案宣告,此時定義可見,即可定義析構函式,呼叫指標的類成員了。
a.h1
2
3
4
5
6
7
8
9
10
#ifndef ah
#define ah
class
b;
class
a ;
#endif
b.h1
2
3
4
5
6
7
8
9
10
11
#ifndef bh
#define bh
#include "a.h"
class
b
};
#endif
a.cpp
1
2
3
4
5
6
7
8
#include "a.h"
#include "b.h"
a::~a()
void
a::setb()
問題到此就解決完畢了~
c 中兩個類互相引用的問題
最近在改乙個c 程式的時候碰到一條警告資訊,警告資訊為 刪除指向不完整 q2dtorusnode 型別的指標 沒有呼叫析構函式 1 c users lxw desktop dragonfly第二階段實驗 最終的實驗版本 實驗目錄 dragonfly modify src q2dtorus.h 6 參...
C 中兩個類互相引用
一 問題描述 現在有兩個類a和b需要定義,定義a的時候需要用到b,定義b的時候需要用到a。二 分析 a和b的定義和呼叫都放在乙個檔案中肯定是不可以的,這樣就會造成兩個迴圈呼叫的死迴圈。根本原因是 定義a的時候,a的裡面有b,所以就需要去檢視b的佔空間大小,但是檢視的時候又發現需要知道a的佔空間大小,...
c 兩個類互相引用的問題
現在有兩個類要相互應用時,會出現各種各樣的問題,首先看第乙個例子 ifndef ah define ah class b class a a endif標頭檔案a.h包含class a如上 ifndef bh define bh class b endif標頭檔案b.h包含classb 此時編譯就會...