2016-12-04 115 views
1

我是Java人,并试图通过类模板编写inheritince,而我得到了很多错误,如:模板专业化需要'template <>'或使用类模板'array'需要模板参数。你们能帮我纠正我的代码或思维方式的错误吗?我上课是这样的:如何在C++中继承模板类?

template <typename T> 

class array { 
public: 
virtual void randomFunction() = 0; 

protected: 
T* values; 
int size; // number of values 
}; 

这里intArray.h

class intArray: public array<int>{ 
public: 
    intArray(); 
    void randomFunction(); 
private: 
}; 

这里intArray.cpp

intArray::intArray() { 
this->size = 1; 
this->values = new int[1]; 
} 

void intArray::randomFunction() { 
this->values[0] = 5; 
} 

我要的是迭代对这些对象,如:

int main() { 
    vector<array> arrayList; 
    arrayList.push_back(intArray()); 
    arrayList.push_back(doubleArray()); 
    arrayList.push_back(stringArray()); 

    anotherFunction(&arrayList); 
} 

void anotherFunction(vector<array> *list) { 
for(array a: (*list)) { 
    a.randomFunction(); 
} 
} 

回答

4

由于您的array是一个类模板,这个vector<array>不是有效的类型定义。由于std::vector需要一个类型参数。

如果您希望完成类型擦除,然后要求你的类模板本身从基继承:

class array_base { 
    virtual void randomFunction() = 0; 
    virtual ~array_base(); 
}; 

template <typename T> 
class array : public array_base { 
    // As before 
}; 

这仍然是不够的,因为C++是不是Java。我们处理对象,并以多态的方式处理它们,我们需要明确地使用(智能)指针或引用。

考虑到这一点,你vector现在应该变成这样:

std:vector<std::unique_ptr<array_base>> arrayList; 
arrayList.emplace_back(std::make_unique<intArray>()); 
+0

你能解释一下多一点?事情是我只是不知道值的类型“T *值”;所以我应该定义3个不同的类,它们是array_base,array和intArray? – Nick

+0

'T *值'取决于您的模板参数。当你声明'数组'时,它会在现场创建一个新的C++类。我会说'intArray'是多余的。 – StoryTeller

+0

好的这里是最后一个问题,将会有10个课程。所有的班级都有不同的大小和价值类型,例如: intArrayWithSizeOne,doubleArrayWithSizeFive,stringArrayWithSizeNine。我应该继续使用相同的数据结构,因此我将定义10个类,数组和array_base。或者我应该将变量T *值更改为void *值,然后在派生类中定义值?对不起愚蠢的问题。 – Nick