0

几乎所有问题都在问题中,但是有什么方法可以通过使用带有模板类的不透明 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 的定义就无法公开,因此您会收到函数丢失错误。

4

1 回答 1

1

他们没有理由不兼容。编译器需要知道的是有一个指针,*类型旁边的那个小点就说明了这一点。您的代码片段虽然有很多错误。尝试编译这个:

template <typename T> class MyClassImp;

template <typename T> class MyClass
{
 private:
     MyClassImp<T>* impl;
};

int main()
{
    MyClass<int> a;
    return 0;
}

注意class定义模板时的关键字和;定义后的关键字。如果你尝试过,你就会知道。你可以编译上面的代码:

g++ -std=c++98 -pedantic -Wall -Wextra a.cpp

你得到的唯一警告a是未使用。

于 2013-03-20T17:28:42.210 回答