2016-12-04 150 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