3

Arrayテンプレート型Tがポインター型または非ポインター型のいずれかである必要があるテンプレート クラスがあります。

template<class T>
class TArray
{   
     static const int max_len=100;
     T* data;
     int length;

  public:
     TArray(){data=new T[max_len]; this->length=0;} 
     void Add(T value){data[length++]=value;}   
     ~TArray();
};

delete問題は、このような非ポインター型を呼び出すことができないため、スペースを解放する方法です

template<class T>
TArray<T>::~TArray()
{
    //for(int i =0; i < length; i++)
    //  delete data[i]; // NOT WORKING WITH OBJECTS THAT ARE NOT POINTERS !!!
    delete[] data;
}

足し算授業をしましょう

class A
{
    int* a;
  public:
    A(int n){a = new int[n];}
    ~A(){delete[] a;}
};

テンプレートクラスの2つのインスタンスを作成します

// Create array of doubles
TArray<double>* double_array = new TArray<double>();
delete double_array;

// Create array of pointers to class A
TArray<A*>* A_array = new TArray<A*>();
A* a = new A(5);
A_array->Add(a);
delete A_array;

デストラクタを呼び出す場合TArray<A*>、クラスのデストラクタを呼び出す必要がありますAが、たとえば double の配列を作成すると、デストラクタのコメント付きコードがコンパイルされない (C2541) ため、方法がわかりません。

4

3 に答える 3

5

デストラクタ内では、データstd::is_pointerのみを使用できます。delete[]

ただし、推奨される代替策は、メモリを自分で管理しないことです(使用std::vectorまたはスマートポインタ)。

于 2012-10-22T15:09:23.177 に答える
3

テンプレートの 2 つのバージョンを開発できます。まず、通常版を書きtemplate<class T>ます。次に、次のように宣言して、テンプレートを特殊化する 2 つ目のポインターのみのバージョンを作成します。

template<class T>
class TArray<T*>
于 2012-10-22T15:09:57.747 に答える
2

std::unique_ptr生のポインタをまたはに置き換えるとstd::shared_ptr、問題はなくなります。

(それが望まない場合は、これを管理する必要があるかどうかをよく考えてください。に格納されているポインターが割り当てられているTArrayことを誰が保証しますか?その問題に対するRAIIソリューションはありません。)TArray<T*>new

于 2012-10-22T15:08:54.980 に答える