我有一个列表模板。
我想列出一份工作清单。但是,当唯一不同的是函数executeJob()时,我有不同的工作。
所以我有一堂课Job:
class Job{...
...
public:
..
virtual SomeType executeJob() = 0;
}
所以它实际上是一个抽象类,在派生类中,所有私有字段都是相同的,并且它具有自己的executeJob()的实现。
假设有两种不同类型的派生类名为Job1
和Job2
,所以我实际上希望我的列表能够拥有Job1 objects
和job2 Objects
。
我的列表是这样定义的:List<Job>
。
但是在ListNode c'tor中我有这个:
listNode(const T& value) : value(new T(value)), prevNode(NULL),
nextNode(NULL){}
当然我对该行有一个问题:value(new T(value))
因为它是一个抽象类。
我如何解决它,以便我仍然可以保存Job1 and Job2 objects
的列表并将其定义为List<Job>
?
答案 0 :(得分:1)
很简单,你不能在构造函数中使用T
。
你需要一个模板化的构造函数,它接受真正的类。然后,您将在参数类型上调用构造函数。
如果你没有类型,只传递“Job”,那么你将不得不使用虚拟clone()
方法切换到基于原型的设计(而不是调用构造函数)。
修改:由于您使用的是new
,我假设List<Job>
是拼写错误,您的意思是List<Job*>
答案 1 :(得分:0)
您不能拥有包含不同对象的列表。
你可以有一个指向基类的指针列表。
答案 2 :(得分:0)
其他答案不能很好地解决的问题是,当你有一个模板化的类C并且用两种不同的模板类型实例化该类时,为了所有实际目的,编译器将这些视为两个不同的类,而不是一个类以两种方式实例化。
除非您提供将指针存储到列表中的基类的建议,否则这些类型是不兼容的。这样,如果B和D派生出A,那么你可以在列表中存储B *和D *,但是通过A *访问它们。