【问题标题】:How to create an array of class template?如何创建类模板数组?
【发布时间】:2016-03-26 00:51:24
【问题描述】:
我需要在 C++ 中创建一个类模板数组,但编译器不允许这样做。
示例:
class CRefBase {
public:
virtual ~CRefBase() = 0;
};
template<class T>
class CRef : public CRefBase {
private:
T *Obj;
public:
CRef(T *Obj){ this->Obj=Obj; }
}
在主函数中
CRefBase *refs;
refs=new CRefBase[200]; // Error in this line : cannot allocate an object of abstract type ‘CRefBase’
我看到了this 主题,但这不是我的答案。
谢谢
【问题讨论】:
标签:
c++
arrays
templates
object
reference
【解决方案1】:
即使你试图实例化一个派生类,这也是一个糟糕的主意,因为数组不能以这种方式索引——当你用除 0 以外的任何索引来索引指向 CRefBase 的指针时,它们必须 只能是CRefBase,不能是任何派生类。
此外,new[] 的使用存在大量异常不安全和内存泄漏,所有合理的代码库都禁止使用。使用std::vector<std::unique_ptr<CRefBase>> 之类的东西是安全的,如果您创建派生类类型的对象,您实际上可能会创建一个可以工作的程序。
【解决方案2】:
CRef 是类模板,CRefBase 是(不可实例化的)抽象基类。
你没有做标题所说的:
如何创建模板类数组?
哦,你需要一个多态指针数组(和一个virtual 基类析构函数):
CRefBase **refs = new CRefBase*[200];
for(size_t i = 0; i < 200; ++i)
refs[i] = new CRef<whatever>(pointer_to_whatever_instance);
就是这样。愉快地管理其动态分配的内存。
【解决方案3】:
下面的代码表示纯虚函数,所以“CRefBase”是一个抽象基类,也就是说它不能被实例化!
virtual ~CRefBase()=0;
作为您的问题,模板 supp.orts 数组。你可以先修复你的编译问题,然后再测试一下