几乎所有问题都在问题中,但是有什么方法可以通过使用带有模板类的不透明 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(); }
这不起作用,因为隐藏在 .cpp 文件中的 MyClass::Foo 如果不包含 MyClassImp 的定义就无法公开,因此您会收到函数丢失错误。