我有一个参数化的纯虚拟基类,其唯一目的是充当派生类的接口:
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;
......但如果可能,我想避免这种情况。
答案 0 :(得分:0)
回答我自己的问题:没有办法做到这一点。我必须为每个派生类都有单独的指针。
共识似乎是我需要创建一个工厂。也就是说,我有一个工厂类,而不是DerivedOne和DerivedTwo,它有返回不同数据类型和容器类型的方法。