【问题标题】:Template T Class Array模板 T 类数组
【发布时间】:2017-04-01 20:13:23
【问题描述】:

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

【问题讨论】:

    标签: c++ arrays class-template


    【解决方案1】:

    我想知道,无论您是创建一维数组还是二维数组,您的初始要求都是一维数组,但您在代码中使用的是二维数组。反正我玩的是一维数组。

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

    很简单,不是吗? :)

    【讨论】:

      【解决方案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();
      }
      
      
                                                                                                                                                                         
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-22
        相关资源
        最近更新 更多