【问题标题】:Release() or factory destroy function in c++C++ 中的 Release() 或工厂销毁函数
【发布时间】:2015-04-08 00:28:16
【问题描述】:

我正在用 c++ 编写一个 dll 库。它只会导出一些带有一些纯虚拟接口的工厂创建功能。 现在我想知道哪种设计更好,例如我们有这样的东西:

API_EXPORT IFactory* CreateFactory();
API_EXPORT Destroy(IFactory* pFactory);

class IFactory
{
  public:
  virtual InterfaceA* CreateA() = 0; 
  virtual InterfaceB* CreateB() = 0; 
  virtual InterfaceC* CreateC() = 0; 
  virtual InterfaceD* CreateD() = 0;
  // virtual void Destory(InterfaceA* p) = 0;
}

假设我从工厂获得接口,我有两种方法可以在完成后删除它。

IFactory* myFactory = CreateFactory();
InterfaceA* myInterface = myFactory->CreateA();
......
......
Method 1:
myFactory->Destroy(myInterface);

Method 2:
class InterfaceA
{
....
virtual void Release() = 0;
}
CImplementationA::Release()
{
    delete this;
}
myInterface->Release();

第二种方法看起来更优雅,因为用户不必在任何地方都持有 myFactory 对象。但如果我错了,请纠正我。

【问题讨论】:

  • 如果有正确实现的虚拟析构函数,只使用delete有什么问题?
  • @jxh 根据 Don Box 的 Essential COM,虚拟析构函数存在可移植性问题。
  • @jxh 具体来说,Don Box 表示虚拟析构函数污染了接口类的编译器独立性,因为虚拟析构函数在 vtbl 中的位置可能因编译器而异 i>.

标签: c++ interface coding-style


【解决方案1】:

我更喜欢第二种方法。对象一旦形成,就应该按照 OOP 的指导方针进行自我管理。我认为没有理由像工厂函数一样将破坏的责任交给其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    相关资源
    最近更新 更多