Pimpl惯用法在dll导出的问题

在建组件类的时候,习惯性的使用Pimpl(pointer to implementation, 指向实现的指针)惯用法。目的是降低耦合、信息隐藏、接口与实现分离。至于很多资料里提到的”降低编译依赖、提高编译速度”个人没有清晰的感受,可能是项目规模的原因,这里只当一个可能提出。因为是指针的缘故,为了确保内存的释放,使用了智能指针std::tr1::shared_ptr,这是C++标准库提供的方法。建立一个接口类类似下面:

class CImpW;
class CINIFILE_API CCIniFileW 
{
	///////////////////////////////////////////
	具体接口内容,省略……
	///////////////////////////////////////////
private:
	std::tr1::shared_ptr<CImpW> m_pImp;
};

工程会生成一个dll文件,但是IDE会发出一个警告:

这个警告是说有对象没有导出,客户调用类的时候可能出现错误。我理解的是调用CImpW类会出现错误,但是在这里,我这么写的目的就是不给客户调用的,所以这个警告在弄清楚之后就直接忽略了。

有一些人可能有强迫症,消除一切的warning。这里有几种方法:

  1. 降低编译器的警告级别,或者直接不提出警告。个人不建议这做,因为我认为“编译器远比你更清楚代码怎么执行的,除非那是你自己写的编译器”。显然,99.99%的人都是用的别人的东西,然后这个忽略就会自己坑自己了,被坑过的可以自己回忆下。
  2. 强制关掉特定警告。这个只有在明确了警告含义,并且很清楚的知道忽略警告不会产生不良后果或者不良后果正是你所预期的。才建议这么做。这个有点符合我的情况,所以在头文件中添加“#pragma warning(disable:4251)”
  3. 导出编译器让你导出的所有对象。C++中这个STL智能指针对象嵌套了很多的类和对象,我感觉实在是太麻烦了就没有做(实际上,试图这么做过,但是放弃了)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章