[英]Include in header file vs. forward-declare and include in .cpp
我有一個B類,我想把成員稱為A類。所以:
1。
//A.h
class B;
class A
{
private:
B* m_p;
};
//a.cpp
#include "B.h"
2。
// A.h
#include "B.h"
class A
{
private:
B * impl_;
};
當一個沒有太多依賴性的小項目涉及時,這兩種方式是否更好?
你做的第一種方式意味着在ah
, class B
的存在是已知的,但不是它的定義 。 這限制了你可以用B
里面做什么ah
。 例如,您可以使用類型B *
變量,但不能使用類型B
變量(因為對於類型B
的變量的聲明,編譯器必須能夠看到B
的完整定義)。 此外,如果您有B *
類型的變量,則不能取消引用指針(因為也必須知道B
的定義)。
因此,您的第二選擇 - 沒有這些問題 - 是首選,這是大多數人在大多數時間使用的。
這是第一種方法可能有用的特殊情況。 例如:
.h
文件包含彼此 (但是你可能會遇到一些其他問題,也就是包含防范問題;這通常很難並且要避免); bh
非常大且復雜,那么您希望盡可能避免包含它,因為它會降低編譯過程的速度。 你的第一種方法是前瞻性聲明。 你的第二個實際上包括B班。
何時使用一個而不是另一個?
答案: 1 。
看看http://www.umich.edu/~eecs381/handouts/handouts.html
C頭文件指南
C ++頭文件指南 (密歇根大學EECS部門David Kieras)說:
准則#10。 如果X類型的聲明不完整,請使用它而不是#including其標題Xh 。 如果另一個結構或類類型X在標題文件的內容中僅作為指針或引用類型出現,那么您不應該#include Xh,而只是在附近放置一個不完整的X聲明(也稱為“前向”聲明)。標題文件的開頭,如:
class X;
有關這種強大而有價值的技術的更多討論,請參閱講義不完整聲明 。 請注意,標准庫包含一個不完整聲明的標頭,通常用於<iostream>
庫,名為<iosfwd>
。 #include<iosfwd>
盡可能,因為<iostream>
標題文件非常大(巨型模板!)。
只需在類A的標題中聲明該類。
class B;
第二個更好。 它使B
類成為您使用.h
文件包含的模塊。 考慮將來子類化B
並更新A
以使用C
。 在第二種情況下,你只需要替換標題#include
和A
的化妝。 在第一種情況下,您必須更改前向聲明。 此外,在第二種情況下,您定義的不僅僅是符號B
和注釋一樣,如果頭文件與其余代碼位於同一目錄中,則應使用#include "Bh"
。
那么你正在做的事情被稱為前向解除,你想要的原因就是如果你有類A的東西使用類B和ALSO類B使用類A.
在只有一種關系的情況下,你當然可以使用你的第二選擇。 如果您需要雙重用法,那么至少有一個類的變換必須使用前向變換
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.