多态性和新算子[C ++]

时间:2017-11-16 12:39:20

标签: c++ polymorphism operator-overloading

我正在开发一个api,它在运行时决定使用哪个更高级别的api,我有很多抽象类,每个高级api的派生类,以及一个为我提供正确派生类的上下文类对于这项工作,使用一个函数(例如):

Mesh* genMesh(data d) { if(m_useA_API) return new A_mesh(d); else return B_mesh(d); }
像这样的东西,现在问题是,是否有可能使代码不那么难看?而不是在上下文类中使用方法,我可以覆盖基类中的new运算符来返回相应的派生类实例吗?

如果没有,有哪些可能的解决方案?

tl;博士这是我想做的事情

Mesh* m = new Mesh(data); // and the base class decides which derived class to use instead of the Context class.

感谢。

1 个答案:

答案 0 :(得分:0)

您不能将new用作工厂,但可以使用实施模式:

class Mesh {
  std::unique_ptr<MeshImpl> _impl;
public:
  Mesh(int data)
  : _impl(
    m_use_A_API
      ? new A_mesh(data)
      : new B_mesh(data)
  ) {
  }
  MeshImpl& get_value() { return *_impl; } 
};

A_meshB_mesh是继承自类MeshImpl的不同类,将以正确的方式初始化;

或者您可以通过下一种方式改进您的工厂代码:

  1. 在类genMesh(int)

  2. 中移动您的方法Mesh
  3. Mesh的构造函数设为私有,以确保没有人直接调用它。