B. *_* N. 7 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;
}
Run Code Online (Sandbox Code Playgroud)
不确定我的思维是否完全迟钝,或者我是否只是错过了一个小元素。任何帮助都很棒。
感谢@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();
}
Run Code Online (Sandbox Code Playgroud)
我想知道无论您是创建一维数组还是二维数组,您的初始要求都规定一维数组,但您在代码中使用二维数组。不管怎样,我和一维数组一起玩。
error: allocation of incomplete type 'T'
T *DynamicArray = new T[size];
Run Code Online (Sandbox Code Playgroud)
您在这里尝试做的是类内初始化,可以对静态数据成员进行初始化,它是非静态数据成员的 c++11 扩展。所以我建议你不要这样做,因为你正在学习。这里只能声明成员,不能初始化。
即使您将其设置为静态,也无法分配它,因为模板类型T仅在对象创建后才知道,因此编译器不知道它将在编译期间分配的类型。所以它应该简单地像
T *DynamicArray;
Run Code Online (Sandbox Code Playgroud)
嵌套函数
C++不支持嵌套函数,学习C++语法。
构造函数和析构函数的使用
构造函数将执行以下功能CreateArray(),析构函数将执行以下功能DeleteArray()
实例化模板类
您应该在尖括号内明确提及模板类将使用的类型
DynArray<int> intArray; // if you want to use int
DynArray<float> floatArray;
Run Code Online (Sandbox Code Playgroud)
您还可以使用自己的自定义类来进行 type T,希望您能在课堂上很快学到东西。
DynArray<MyCustomClass> customArray;
Run Code Online (Sandbox Code Playgroud)
如果你纠正了所有这些事情,那么你的最终骨架将如下所示
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;
}
Run Code Online (Sandbox Code Playgroud)
很简单,不是吗?:)