PHPの背景から来て、私はそれが面白い言語を見つけるので、私はC + +を学ぼうとしています。練習として、テンプレートを使用して単純なVectorクラスを作成したいと思います。これは難しくありません。しかし、私は1つの問題に遭遇します。私の基本的なベクトルクラスのテンプレートパラメータとして配列を使用する
私は、次のテンプレートクラス作成しました:
template <typename T>
class Vector
{
public:
Vector(int length);
~Vector(void);
int getLength();
T& operator[] (const int index);
private:
T *_items;
int _count;
};
template <typename T>
Vector<T>::Vector(int length)
{
_items = new T[length];
_count = length;
}
template <typename T>
T& Vector<T>::operator[](const int index)
{
if (index >= getLength() || index < 0)
throw exception("Array out of bounds.");
return _items[index];
}
すべての機能が実装されているが、しかし、彼らは私の質問に関連していないですので、私はそれらをここにコピーしていません。
このクラスは期待どおり動作しますが、例外は1つあります。 配列のベクトルを作成したい場合、それは動作しません。 例えば:私は何を明らかにしたいことは、ベクトルクラスの_itemsプロパティはint型になるということです
Vector<int[2]> someVector(5);
[5] [2]。しかし、コンパイラは 'T'を 'int [2]'に置き換えるので、_itemsプロパティはint [2] [5](または少なくともデバッグから理解したものです。 )。その結果、[]演算子はもはや正しく動作しません。したがって、このクラス全体は配列にとって無用です。
この問題を解決する方法があるので、このクラスは配列に対しても機能しますか?それができない場合は、このクラスが配列で初期化されないようにする方法がありますか?
編集:これまでのすべてのご回答ありがとうございます。しかし、私は私の質問で完全にはっきりしていないかもしれません。まず第一に、私はこのクラスを作成してC++に慣れました。std :: vectorクラスがあることを知っています。また、ベクトルのベクトルを使用する方が良いことになりました。それは本当に問題ではありません。私はちょうどテンプレートをよく理解したいと思っています。一般的にC++なので、この種の問題に対処する方法を知りたいのです。私は、プログラムをクラッシュさせないクラスを作成できるようにしたい。私または他の誰かがこのクラスを今使っていて、このクラスのためにベクトルの代わりにプリミティブ配列を使用しようとすると、配列が間違っているためにプログラムがクラッシュすることがあります(Vector(y)はint [x] [y ]の代わりにint [y] [x]を使用します)。ですから正しい配列を作成するか、配列で配列を初期化するのを防ぐソリューションが必要です。
[良いC++の入門書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)があることを確認してください。言語の基礎を理解することなく、良い、正しい、エラーのないC++コードを書くことを学ぶことは非常に難しくありません。 –
"あまりにもハードではないテンプレートを使用する" - 独自のテンプレートクラス/関数を作成する場合は、 "テンプレート"と "それほど難しくない"は同じセンテンスには実際には収まりません。それはトリッキーです。 – Mat
Matのコメントに追加するにはテンプレートは難しいかもしれません。特に、(int [2]オブジェクトのような)非基本的な型に対応したい場合には、テンプレートが難しいかもしれません。それらはC++を学ぶ素晴らしい方法ではありませんが、これは優れたSTL Vectorオブジェクトの存在から学ぶ大きな例ではありません。 – Pete855217