在C ++中可重用的指向模板基类型的指针

时间:2014-05-04 23:03:59

标签: c++ templates pointers

我有一个参数化的纯虚拟基类,其唯一目的是充当派生类的接口:

template <typename T>
class Base {
public:
  virtual T get() = 0;
};

然后,我有具体的子类,基本上是工厂。每个都返回一个不同类型的对象:

class DerivedOne : Base< vector<int> > {
public:
  // ctors, etc.
  vector<int> get();
};

class DerivedTwo : Base< map<double> > {
public:
  // ctors, etc.
  map<double> get();
};

到目前为止,这么好。但是在客户端代码中,我想使用指向基类的指针,并使用它来从派生类创建对象。这是一个例子:

Base* creator;
vector<int> stuffOne;
map<double> stuffTwo;

creator = new DerivedOne();
stuffOne = creator->get();
delete creator;

creator = new DerivedTwo();
stuffTwo = creator->get();
delete creator;

但是这不起作用,因为如果没有指定参数类型,就不能有指向参数化类型的指针。因此,creator可以是Base< vector<int> >*Base< map<double> >*,但不仅仅是Base*

这违背了使用指针和分配/解除分配派生对象的整个目的。 (正如你猜测的那样,真实世界派生的对象拥有大量内存,因此在运行时期间销毁它们是可取的。)

有没有人有任何建议?我看过抽象工厂,但他们并没有完全按照我的需要去做。我明确地设置了它,以便客户端代码不会比现在复杂得多。

编辑:我想避免的是为每个派生类使用不同的指针。这将与现在的代码一起使用:

DerivedOne* d1 = new DerivedOne();
stuffOne = d1->get();
delete d1;

DerivedTwo* d2 = new DerivedTwo();
stuffTwo = d2->get();
delete d2;

......但如果可能,我想避免这种情况。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题:没有办法做到这一点。我必须为每个派生类都有单独的指针。

共识似乎是我需要创建一个工厂。也就是说,我有一个工厂类,而不是DerivedOne和DerivedTwo,它有返回不同数据类型和容器类型的方法。