私はSTLでのビルドを持っていませんが、私は私自身のstd ::ベクトルの実装に取り組んでいますテンプレートはカスタム実装::ベクトル
をサポートしていないプラットフォームのために書いています。 Tは非trivalコンストラクタ、非trival破壊し、オーバーロード演算子=を持っている場合
template<typename T> class Array
{
private:
T * buffer;
int count;
int capacity;
public:
Array() : buffer(0), count(0), capacit(0) { }
~Array() { if(buffer) delete[] buffer; }
void IN_ANY Reserve(const int capacity)
{
if(capacity >= count)
{
T * newBuff = new T[capacity];
if(capacity > count)
memset(newBuff+count, 0, (capacity-count) * sizeof(T));
memcpy(newBuff, buffer, count * sizeof(T));
if(buffer)
delete [] buffer;
buffer = newBuff;
this->capacity = capacity;
}
}
// Other methods...
}
問題が来ます。次に、配列の追加メモリを予約するとき、Tのデストラクタが呼び出され、コンストラクタが呼び出されます。しかし、コンストラクタをコピーすることはできません(memcpyを使用して以来)。私はどのようにリザーブメソッドを改善できますか?
これで十分ではありません。今書いているように、あなたは既にTを構築しているので、その上に新たに配置すると、すでに構築された一度だけのオブジェクトに構築されます。独自の配列クラスを書くことは楽しい学習ですが、プレースメントのようなものの専門家ではなく、STLと同じレベルの洗練を求めているなら、あなたは傷ついている世界のためです。 – StilesCrisis