管理された配列を表すテンプレート クラスに取り組んでいます。
E (*data)[];
データは私の配列です。
data = new E[size];
そして、これは、好きではありません。それは私を投げます。
代入で Component* を Component (*)[] に変換できません
また、テンプレート型にポインター型を渡さなかったのに、なぜ E が * で示されているのか説明できますか?
E (*data)[];
data
E へのポインターではなく、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];
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_;
};