在C++經常可以看到的東西,如:將C++類成員一致地定義爲唯一指針;
類C的部首
//== C.h ==//
#pragma once
#include "B.h"
class C
{
B b;
};
類B的部首
//== B.h ==//
#pragma once
#include "A.h"
class B
{
A a;
};
類的首部A
//== A.h ==//
#pragma once
class A
{
};
由於C.h
包括B.h
,和B.h
包括A.h
; C.h
最終知道關於A.h
的實現細節。在這種情況下,標題只包含三個深度級別,但在包含一個標題的大型項目中可以快速導入包含數百個額外標題。也導致編譯時間過長。
在C++ 11 I可以宣佈標題如下:
//== C.h ==//
#pragma once
#include <memory>
// proto
class B;
class C
{
std::unique_ptr<B> b;
};
類B的部首
//== B.h ==//
#pragma once
#include <memory>
// proto
class A;
class B
{
std::unique_ptr<A> a;
};
部首類的
//== A.h ==//
#pragma once
class A
{
};
:
C類的報頭
Wh用智能指針替換所有成員(類,結構體),我可以包含C.h
而不必知道類B的實現。每個cpp文件現在只需知道它的成員,而不必知道它的成員的內存佈局。
我的問題是:
- 是好設計實踐(一個好主意),以取代所有的類成員,那要麼是類和結構,具有獨特的指針?他們的額外親或者是否?
這與pimpl成語相似。缺點是每次你想訪問成員時都會有間接的問題,而且你的班級佈局現在已經在內存中有效地分散了。 – Simple
不完全。 pImpl將一個類拆分爲私有和公共部分,並允許通過公共接口訪問私有實現。它也是一個編譯防火牆,但有些不同。 – Enigma
這甚至不是一個很好的代碼。如果完整的類聲明不存在,您將無法使用默認的刪除器instanciate unique_ptr,因爲它會對轉發的類型調用delete,這是未定義的行爲。我贊同@Simple,你提出的只不過是Pimpl。 – galop1n