模板 T 类数组

7
我在C++课程中有一个(本应该很简单的)作业。
以下是作业要求: 创建一个类模板,包含两个私有数据成员:T * array和int size。使用构造函数根据输入的大小分配数组。还有一个成员函数,允许用户根据大小填充数组。此外,还有一个成员函数对数组进行排序并显示已排序的元素。使用析构函数来删除数组。编写main()函数创建两个对象以调用成员函数。结果,第一个对象将保存其double类型的数组,而另一个对象将保存其int类型的数组。
以下是我想出的代码,但出现了“Allocation of incomplete type '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个回答

2

根据您提供的描述,我认为您想要做类似于以下内容的事情:

#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
我想知道你是在创建一维数组还是二维数组,你的初始要求说明了一维数组,但你在代码中使用了二维数组。无论如何,我将按照一维数组的方式进行操作。 错误:分配不完整类型'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;
}

简单,不是吗? :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接