模板T类数组

时间:2016-11-18 04:14:06

标签: c++ arrays class-template

我的C ++类中有一个(应该很简单的)赋值。

这是作业: 创建一个包含两个私有数据成员的类模板:T * array和int size。该类使用构造函数根据输入的大小分配数组。有成员函数允许用户根据大小填写数组。此外,还有一个成员函数可对数组进行排序并显示已排序的元素。使用析构函数删除数组。开发main()来创建两个对象来调用成员函数。因此,第一个对象将保持其double类型的数组,另一个将保存其int类型的数组。

以下是我提出的问题,但提出错误的"分配不完整类型' T'":

#include <iostream>
#include <new>
#include <vector>
using namespace std;
template <class T>
class DynArray {
protected:

int size;
T ** DynamicArray = new T[size];

public:
DynArray(){
void CreateArray(){
cout << "Enter size of Array: ";
cin >> size;
for (int i = 0; i < size; ++i){
DynamicArray[i] = new T();
}
for (int i = 0; i<size; i++) {
cout << "Element " << i << ": ";
cin >> DynamicArray[i];}
}
//Sort Array
void Sort(T a[], int size)
{
int idx, pass;
for (pass=0; pass<size; ++pass){
for (idx=0; idx<size-1; ++idx){
if (a[idx] > a[idx+1])
swap(a[idx], a[idx+1]);}
}
for (int i=0; i<size; ++i) {
for (idx = 0; idx<size-1; ++idx) {
cout << a[idx] << " ";
}
}
}
void DeleteArray(){
for (int i = 0; i < size; ++i){
delete DynamicArray[i];
}
delete[] DynamicArray;
}
};
int main() {
DynArray<class T>();
return 0;
}

不确定我的思维方式是否完全迟钝,或者我是否只是缺少一个小元素。任何帮助都很棒。

感谢@jblixr和@ user3655463的帮助。我得到了解决方案,我想你的提示和帮助。 如果其他人正在研究这个问题,我可以参考以下内容。

#include <iostream>
#include <new>
#include <algorithm>
using namespace std;

//Template Class T
template <class T>
class DynArray {
protected:
    int size;
    T * DynamicArray;
public:
    DynArray(){};
    DynArray(size_t s): size(s) {
        DynamicArray = new T[size];
        for (int i = 0; i<size; i++) {
            cout << "Element " << i << ": ";
            cin >> DynamicArray[i];

        }
    }
    //Sort Array
    void Sort(){
        sort(DynamicArray, DynamicArray+size);
        for (int i=0; i<size; i++) {
            cout << DynamicArray[i] << endl;
        }
    }

    //Clear Heap
    ~DynArray() {
        delete []DynamicArray;
    }
};

int main() {
    int sizeOfArry;
    cout << "Enter size of Array: ";
    cin >> sizeOfArry;

    //Use as an int Array;
    DynArray<int> intArray = DynArray<int>(sizeOfArry);
    intArray.Sort();
}

2 个答案:

答案 0 :(得分:0)

从描述中,你向我提供了你想做的事情:

  #include <iostream>
    #include <algorithm>

    using namespace std;
    template <class T>
    class DynArray {
    protected:
    int size;
    T * DynamicArray;
    public:
    DynArray(size_t s): size(s) {
        DynamicArray = new T[s];
    }

    void CreateArray(){
        size_t size;
        cout << "Enter size of Array: ";
        cin >> size;
        if(size > this->size)
          size = this->size;
        for (int i = 0; i<size; i++) {
        cout << "Element " << i << ": ";
            cin >> DynamicArray[i];
        }
    }
    //Sort Array
    void Sort()
    {
       std::sort(DynamicArray, DynamicArray+size);                                                                                                                                            
    }

    DynArray() {
     delete []DynamicArray;
    }
};

int main() {
        DynArray<double> dob(3);
        DynArray<int> di(3);
        dob.CreateArray();
        di.CreateArray();
        dob.Sort(); di.Sort();
    }

答案 1 :(得分:0)

我想知道无论您是创建一维数组还是2D数组,您的初始要求都会说明一维数组,但您在代码中使用的是2D数组。无论如何,我和一维数组一起玩。

<强> error: allocation of incomplete type 'T'

T *DynamicArray = new T[size];

您在这里尝试的是可以对静态数据成员进行的类内初始化,它是非静态数据成员的c ++ 11扩展。所以我建议你不要这样做,因为你正在学习。您只能声明成员,不要在此初始化。

即使你创建静态也无法分配,因为模板类型T仅在创建对象后才知道,因此编译器不知道它将在编译期间分配的类型。 所以它应该简单地作为

T *DynamicArray;

嵌套功能

C ++不支持嵌套函数,学习C ++语法。

构造函数和析构函数的用法

构造函数将执行CreateArray()的功能,析构函数将执行DeleteArray()

的功能

实例化模板类

您应该明确提及模板类将要使用的尖括号内的类型

DynArray<int> intArray; // if you want to use int
DynArray<float> floatArray;

您也可以将自己的自定义类用于T类型,希望您很快就会在课堂上学习。

DynArray<MyCustomClass> customArray;

如果你纠正了所有这些事情,那么你的最终骨架就像下面的那个

template <class T>
class DynArray {
protected:
    int size;
    T *DynamicArray ;

public:
    DynArray() {
        // initailize DynamicArray here
        // use your CreateArray() code here
    }

    void sort() {
        // your own sort logic
        // No need to pass the size to this function, its a member function 
    }

    ~DynArray() {
        // use your DeleteArray() code here
    }
};

int main() {
    DynArray<int> intArray;
    intArray.sort()
    return 0;
}

简单,不是吗? :)