我想创建一个包装Excel Automation的库,并且只展示它的一些巨大功能。 我使用#import机制来处理Excel的COM,所以现在我有:
// EXCELAPP.H
#import "C:\\PathTo\\mso.dll" //...
#import "C:\\PathTo\\VBE6EXT.OLB" //...
#import "C:\\PathTo\\EXCEL.EXE" //...
class ExcelApp
{
public:
ExcelApp();
~ExcelApp();
void CloseExcel();
void ShowWindow();
void HideWindow();
// ...
private:
Excel::_ApplicationPtr m_app;
};
这是在一个静态库项目中,我在我的程序中使用它很好。
事情是,我想"隐藏"来自图书馆的用户如何实施。实施可能在未来发生变化。此外,在.h文件中导入会向库的用户公开所有COM接口,我不希望它们(我的未来包括在内)滥用它。所以我想做像PImpl这样的事情,但我需要至少前向声明m_app,我不知道该怎么做。
那么,有没有办法转发声明_com_ptr_t指针,如Excel :: _ ApplicationPtr?或者有更好的方法去做我想做的事情吗?
答案 0 :(得分:2)
如果你真的想那样做的话。我会创建一个没有m_app指针的基类。让所有功能都是虚拟的。 (是的,这基本上是创建一个“界面”。(称之为CExcelApp ......)
从第一个派生一个班级。在其中添加m_app变量并覆盖所有虚函数。您不会将此类公开给您的用户。 (称之为CExcelAppImp ......或其他)
在你的基类中创建一个实例化CExcelApp实例的静态函数,但在实现中,它会实例化CExcelAppImp。
class CExcelApp
{
protected:
CExcelApp(); // make your constructors protected
public:
static CExcelApp* CreateInstance();
};
// in your implementation
CExcelApp CExcelApp::CreateInstance()
{
return new CExcelAppImp();
}
这只是一种方式......