2010-03-17 42 views
5

由於某種原因,我正在考慮在一些函數(方法)中實現接口作爲本地類。將抽象類實現爲本地類?優點和缺點

考慮以下幾點:

class A{ 
public: 

    virtual void MethodToOverride() = 0; 

}; 

A * GetPtrToAImplementation(){ 

    class B : public A { 
    public: 
     B(){} 
     ~B(){} 

     void MethodToOverride() { 
      //do something 
     } 
    }; 

    return static_cast<A *>(new B()); 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

    A * aInst = GetPtrToAImplementation(); 

    aInst->MethodToOverride(); 

    delete aInst; 
    return 0; 
} 

我爲什麼這樣做的原因是:

  1. 我很懶在單獨的文件
  2. MethodToOverride只是代表呼籲實現類(B)到其他類
  3. B類不應該對其他用戶可見
  4. 不需要擔心ab刪除aInst,因爲智能指針用於實際執行

所以我的問題是,如果我這樣做的權利?

在此先感謝!

+0

爲什麼不能在'A'的實現文件中完全定義'B'(非本地)? – 2010-03-17 14:11:07

+1

只是一個挑逗,但A應該有一個虛擬析構函數 – jpalecek 2010-03-17 14:11:21

+0

A只是一個接口 - 在頭文件中聲明。另外,在定義GetPtrToAImplementation的翻譯單元之外,B不可見。 – sinek 2010-03-17 14:17:45

回答

5
  1. 你可以在你實現GetPtrToAImplementation()實現文件的具名命名空間定義B

  2. A應該有一個虛擬的dtor。

  3. 按照當前的C++標準,你不能使用本地類作爲模板參數。 (這意味着你不能在STL中使用它們)

+0

@sbi:現在看來我該休息一下了,因爲我記不清未命名的命名空間:) p.s.感謝他們不能用作模板參數的信息,因爲我不知道它! – sinek 2010-03-17 14:20:02