0

以下は、さまざまなタイプのデータ要素を格納する Vector のテンプレート クラスです。コピーコンストラクタとメインのコードを確認してください。私が期待していたのは、「cout << vCHAR2[2] << endl;」というステートメントです。コピー請負業者は浅いコピーを行っていますが、「責任」を印刷しているため、値「費用」を印刷する必要があります。

誰でも私を助けることができますか?ありがとう。

template<typename T>
class Vector{
  private:
      T* ptr;
      int size;
  public:
      Vector<T>(int s = 10){
           size = s;
           if(size!=0)
           {
               ptr = new T[size];

           }else{
               ptr = 0;
           }

      }
      Vector<T>(const Vector<T> &copy){
            this->size=copy.getSize();

            if(size !=0)
            {
                 ptr=new T[size];
                 for(int i=0;i<size;i++)
                    ptr[i] = copy.ptr[i];    
            }else{
               this->ptr=0;
            }
      }

      ~Vector<T>(){
         if(size>0)
         {
            delete[] ptr;
         }
      }
      int getSize() const
      {
          return size;    
      }
      const Vector<T> & operator = (const Vector<T> &rhs){
            if(this!=&rhs)
                 delete [] this->ptr;
                 size = rhs.size;
                 if(size!=0)
                 {
                      ptr=new T[size];
                      for(int i=0;i<size;i++)
                              ptr[i] = rhs.ptr[i];
            }

            return *this;

      }

      T& operator[](int index){
         if(index>=0 && index<=size)
            return ptr[index];
      }
};    




int main(int argc, char *argv[])
{
  Vector<char*> vCHAR(10);
  vCHAR[0]="asset";
  vCHAR[1]="income";
  vCHAR[2]="liability";

  Vector<char*> vCHAR2(vCHAR);
  vCHAR[2] = "expense";

  cout << vCHAR[2] << endl;

  cout << vCHAR2[2] << endl;

  system("PAUSE");
  return EXIT_SUCCESS;
}
4

4 に答える 4

0

ベクトルを実装するために選択した設計は危険です。ある種のノード割り当てアプローチを使用して要素を管理することを決定した場合(std::vectorブロック割り当てアプローチを使用する場合)、ポインターとメモリー管理ルーチンに注意する必要があります。あなたが抱えている問題は、配列コピールーチンを含む、T* ptr;ポインタの操作方法に関連しています。T& operator[]あなたの例では、charへのポインタからポインタを操作しています- char**(テンプレートを)に置き換えてくださいchar*。ノード割り当てアプローチを使用して独自のベクトル実装を設計することにした場合はstruct VectorTraits、少なくともそれを使用してベクトルクラスを実装および設計することをお勧めします。std::stringまた、char*の代わりに使用することをお勧めします。

于 2012-07-06T09:32:18.063 に答える
0

行で:

Vector<char*> vCHAR2(vCHAR);

vCHAR2[2] は文字列「liability」へのポインタです。この線

vCHAR[2] = "expense";

vCHAR[2] が変更されたとしても、vCHAR2[2] は依然として「責任」を指しているため、vCHAR2[2] の値は変更されません。

それを変更するには、直接割り当てる必要があります。

vCHAR2[2] = "expense";

あなたが達成しようとしているのは、次のようなものだと思います。

int* p = new int();
*p = 111;

int* q = p;

*p = 222; // change the content of what is pointed to

cout << *p << endl; // 222
cout << *q << endl; // 222 also

ただし、指し示す内容を変更しているため、これは別のケースです。ポインタの割り当てだけを行った場合、内容は変更されません。ポインタだけがメモリの別の領域に割り当てられます。

*p = 111;

int* q = p;

int z = 333;
p = &z; // do not change the content of what is pointed to, point to another area

cout << *p << endl; // 333
cout << *q << endl; // 222 still
于 2012-07-06T09:37:48.117 に答える
0

コピー ctor はディープ コピーを行うため、vCHAR2 には独自の要素配列があります。したがって、ソース ベクターの要素をいつ変更するかを確認する必要はありません。( strcpy() またはへのアクセスを介してポイントしたデータを変更すると、それが表示されますvCHAR[2][0]='X';(文字列リテラルを操作するため、これがプログラムをクラッシュさせない場合)))

于 2012-07-06T08:28:33.840 に答える
0

vCHAR[2] = "expense" では、ベクトル vCHAR 内のポインターを変更していますが、vCHAR2[2] はまだ古い場所を指しています。つまり、ポインターの浅いコピーはありません。ベクトルをコピーするときにソースから T* を再利用した場合、必要なものが得られます。

于 2012-07-06T08:28:37.397 に答える