-3
在問題中有很多東西,但是有沒有什麼辦法可以獲得使用模板類使用不透明ptr的封裝? (我的直覺是「不」,因爲編譯器必須知道編譯時的一切)模板和不透明指針是否繼承不兼容?
就像這樣,MyClass應該通過靜態庫公開,而MyClassImp是隱藏的。
//MyClass.h
template <typename T> MyClassImp;
template <typename T> MyClass
{
public:
MyClass();
void Foo();
private:
MyClassImp<T>* impl;
}
//MyClassImp.h
template <typename T> MyClassImp
{
public:
MyClassImp() {}
void Foo() {/*proprietary/complex stuff I want to hide*/}
}
//MyClass.cpp
template <typename T>
MyClass::MyClass()
{
impl = new MyClassImp();
}
template <typename T>
void MyClass::Foo() { impl->Foo(); }
這不起作用,因爲MyClass的::富,藏在.cpp文件,不能沒有包括MyClassImp的定義暴露出來,所以你得到一個功能缺失的錯誤。
是的,對不起,只是扔在一起psudo代碼。問題是,如果你確實使用了impl中的任何東西,你必須在頭文件中聲明整個類,否定opaque ptr的目的。 – IdeaHat 2013-03-20 18:31:16