2010-03-17 45 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