2012-12-16 36 views
2

我在C++中創建一個靜態庫來定義其他人可以在其代碼中使用的類。但是,該類的成員是從其他人獲得的頭文件中定義的類型,我不想分發此人的頭文件的內容。隱藏第三方C++頭文件的內容

這是目前公開的接口(interface.h):

class B { 
    TypeToHide t; 
    // other stuff ... 
}; 

class A { 
    double foo(); 
    B b; 
}; 

這裏是(code.cpp)將被編譯成一個靜態庫的代碼:

double A::foo() { 
    // ... 
} 

而且這裏是我需要隱藏的公共視圖(HideMe.h)的文件:

struct TypeToHide { 
    // stuff to hide 
}; 

我能做些什麼隱藏公司HideMe.h的幾個?理想情況下,我可以將整個結構從HideMe.h粘貼到code.cpp中。

回答

6

您可以使用PIMPL習慣用語(Chesshire貓,不透明指針,無論您想稱它爲何)。

由於現在的代碼,您不能隱藏TypeToHide的定義。另一種方法是這樣的:

//publicHeader.h 
class BImpl;   //forward declaration of BImpl - definition not required 
class B { 
    BImpl* pImpl;  //ergo the name 
    //wrappers for BImpl methods 
}; 

//privateHeader.h 
class BImpl 
{ 
    TypeToHide t; //safe here, header is private 
    //all your actual logic is here 
}; 
+0

好的,所以使用PIMPL慣用法或多或少是處理這種情況的標準方式? – synaptik

+2

@synaptik是... –

+0

工程就像一個魅力(當然)。 – synaptik

1

比平普爾簡單,你可以用一個指針TypeToHideforward declaration它:

class B { 
    TypeToHide* t; 
    // other stuff ... 
}; 

只要你將不再需要有關T的內部結構知識用戶的代碼,你不必暴露它,它會在你的庫中保持安全。
庫中的代碼必須知道TypeToHide是什麼,但這不是問題。

+0

謝謝。 PIMPL和你的建議有什麼區別? (我是PIMPL的新成員,所以請原諒我的無知。) – synaptik

+0

Pimpl是一個更爲結構化的範例,聲稱通常應該避免暴露類型的內部結構。相反,你應該聲明一個指向實際實現的指針(P-> impl)並且只暴露這個指針。對我而言,這個原則有時過於激進,我很樂意讓一些公開的實現。例如,在這個問題中,您可能只想隱藏TypeToHide的實現細節,但根據Pimpl,您應該將B本身隱藏在Bimpl類型後面(如Luchian所示)。 –

+0

我明白了。這就說得通了。感謝您的教育:) – synaptik