-1

管理された配列を表すテンプレート クラスに取り組んでいます。

E (*data)[];

データは私の配列です。

data = new E[size];

そして、これは、好きではありません。それは私を投げます。

代入で Component* を Component (*)[] に変換できません

また、テンプレート型にポインター型を渡さなかったのに、なぜ E が * で示されているのか説明できますか?

4

2 に答える 2

3
E (*data)[];

dataE へのポインターではなく、E の配列へのポインターです (E へのポインターの配列と混同しないでください)。非常に大きな違いがあります。

編集:理解を助けるために...

newへのポインターを返しますが、 E の配列へのポインターとしてE宣言しています。配列は C の型です! それは単に変装したポインターではありません。配列は、特定の状況でポインターに崩壊することがありますが、両方の方法ではありません。data

編集2:

あなたのコメントごと:

E ポインターの新しい配列を作成しているという印象を受けましたか?

http://cdecl.org/にアクセスしてください

まず、次のように入力します。

int (*data)[];

それが言うことを読んでください。次のように入力します。

int *data[];

もう一度読んで、同じことを言っているわけではないことに注意してください。1 つは int の配列へのポインターとして、もう 1 つは int へのポインターの配列です。大きな違い。

ポインターの配列を動的に割り当てたい場合は、次のdataように宣言する必要があります。

E **data;

その後

data = new E*[size];
于 2012-06-28T00:44:10.620 に答える
1

dataメンバーをE*. 配列スタイルの ala に引き続きインデックスを付けることができますdata[i](この表記法をポインターと整数値で使用する場合、基本的には、ポインターと、ポイント先のオブジェクトのサイズを i 倍したものを追加することを意味します)。

編集:

template <typename E>
class X
{
    X(int initial_size) : data_(new E[initial_size]), size_(initial_size) { }
    X(const X& rhs) : data_(new E[rhs.size_]), size_(rhs.size_) { std::copy(...); }
    ~X() { delete[] data_; }
    void capacity(int new_size)
    {
        E* p = new E[new_size];
        std::copy(p, p + new_size, data_);
        delete[] data_;
        data_ = p;
        size_ = size;
    }
    ...
  private:
    E* data_;
    int size_;
};
于 2012-06-28T00:43:55.843 に答える