4

C++ クラスに (単純なはずの) 割り当てがあります。

課題は次のとおりです。 T * 配列と int サイズの 2 つのプライベート データ メンバーを含むクラス テンプレートを作成します。クラスは、コンストラクターを使用して、入力されたサイズに基づいて配列を割り当てます。ユーザーがサイズに基づいて配列を埋めることができるメンバー関数があります。さらに、配列をソートし、ソートされた要素を表示するメンバー関数があります。デストラクタを使用して配列を削除します。main( ) を開発して、メンバー関数を呼び出す 2 つのオブジェクトを作成します。その結果、最初のオブジェクトは double 型の配列を保持し、もう 1 つのオブジェクトは 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();
}
4

2 に答える 2

1

作成するのが 1 次元配列か 2D 配列かに関係なく、最初の要件には 1 次元配列が記載されていますが、コードで 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;

type に独自のカスタム クラスを使用することもできます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;
}

シンプルですね。:)

于 2016-11-18T05:59:34.630 に答える