2016-11-18 37 views
3

我在我的C++类中有一个(应该是简单的)任务。模板T类数组

以下是作业: 创建一个包含两个私有数据成员的类模板: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(); 
} 

回答

0

我想知道这是要创建一个一个维数组或二维数组,你最初的要求表示一维数组,但是您在代码中使用二维数组。无论如何,我一起玩一维数组。

error: allocation of incomplete type 'T'

T *DynamicArray = new T[size]; 

你正在尝试做的,是在类的初始化,可以为静态数据成员来完成,这是一个C++ 11扩展非静态数据成员。所以我建议你不要这样做,因为你正在学习。您只能声明成员,并且不要在此初始化。

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

T *DynamicArray; 

嵌套函数

C++不支持嵌套函数,学习C++的语法。构造函数和析构函数的

使用

构造函数会做的CreateArray()功能和析构函数会做的DeleteArray()

的functionlaity实例化一个模板类

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

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; 
} 

简单,不是吗? :)

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(); 
    }