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

Re-usable pointer to template base type in C++

本文关键字:指针 类型 基类 c++      更新时间:2023-10-16

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

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;

…但是如果可能的话,我想尽量避免。

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

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

相关文章: