如何使用不同的参数实例化类

时间:2013-06-11 03:53:30

标签: c++

我需要一种方法来计算数据集中的各种类型的异常。因此,我正在考虑使用通用的Anomaly接口,它定义了具体异常的接口。然后我的应用程序可以简单地使用接口来迭代各种具体策略。

我遇到的主要问题是混凝土异常的构造需要不同的输入。例如,

class Anamoly
{
public:
  template <typename T> 
  virtual Anamoly * getInstance(T &) = 0;
  virtual void processAnamoly() = 0;
  virtual bool containsAnamoly() = 0;
  virtual void logAnamoly() = 0;
};

由于模板函数不能是虚拟的,有没有办法解决这个问题,这将允许构建具有不同输入的具体异常,但是,允许我使用通用接口来执行其余的行为吗?

1 个答案:

答案 0 :(得分:1)

带有模板参数的虚函数不起作用,但您可以使用静态模板函数:

class Anomaly {
public:
  template <typename T> 
  static Anomaly * getInstance(T &);
  virtual void processAnamoly() = 0;
  virtual bool containsAnamoly() = 0;
  virtual void logAnamoly() = 0;
};

然后,无论何时定义相关的子类,都要实现Anomaly::getInstance(),例如在myanomaly.cpp中:

class MyAnomaly : public Anomaly {
  // implement virtual functions
};

Anomaly * Anomaly::getInstance(MyType & t) {
  return new MyAnomaly(t);
};

这种方法的优点是,无论何时添加新类,都不需要触摸anomaly.h头文件,也不需要在定义文件之外公开子类。缺点是类型错误仅在链接时捕获,而不是在编译时捕获。

相关问题