[英]How to forward-declare _com_ptr_t pointers?
我想創建一個用於包裝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,而且我不知道該怎么做。
因此,有什么方法可以像Excel :: _ ApplicationPtr一樣轉發聲明_com_ptr_t指針? 還是有更好的方法來做我想做的事情?
如果您真的想那樣做。 我將創建一個沒有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();
}
這只是一種方式
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.