2011-12-07 15 views
0

私は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を使用して以来)。私はどのようにリザーブメソッドを改善できますか?

答えて

-1

あなたが本当にPJ Plauger、アレクサンダー・ステパノフで「C++標準テンプレートライブラリ」本を取りに行く、STLの大部分を実装する方法を知りたい場合は、私が探していた答えが

+0

これで十分ではありません。今書いているように、あなたは既にTを構築しているので、その上に新たに配置すると、すでに構築された一度だけのオブジェクトに構築されます。独自の配列クラスを書くことは楽しい学習ですが、プレースメントのようなものの専門家ではなく、STLと同じレベルの洗練を求めているなら、あなたは傷ついている世界のためです。 – StilesCrisis

1

新しい配置し、 Meng Lee、David R. Musserなどがあります。

STLの大部分をどのように実装するかについては、いくつかの標準の解釈と使用に伴います。それはかなり古い本ですが、カバーの下で何が起こっているかを見るのは非常に面白いです。

これを行う方法はあまり分かりませんが、それだけで済むようにしたい場合は、ソース偽造プロジェクトを見ることに関するその他の回答に進んでください。

関連する問題