4

ポリゴン クラスをコピーするためのこのコードがあります。私が抱えている問題は、最終的に頂点が元のポリゴン クラスの場所を指していることです。コピーコンストラクターが呼び出されていないようです。何故ですか ?

Polygon::Polygon(const Polygon &aPolyToCopy)
{
int i;
vertices = new Vertex[aPolyToCopy.count];

for (i=0;i<aPolyToCopy.count;i++)
{
    vertices[i].x = aPolyToCopy.vertices[i].x;
    vertices[i].y = aPolyToCopy.vertices[i].y;
}

count = aPolyToCopy.count;
}

リストテンプレートでこれを行います

template <class T, int i>
bool SortedVector<T, i>::add ( const T& v )
{
myClass[myCurrent] = v; //Copy constructor not called ?
myCurrent++;

return true;
}

テンプレートは

 template <class T, int i>
 class SortedVector
 {
 public:
   int maxSize;
   T myClass[i];
   int myCurrent;

   SortedVector();
   ~SortedVector();
   bool add ( const T& v );
};
4

2 に答える 2

3

あなたは割り当てを行っていますが、ここでは新しいオブジェクトを構築しません。カスタム コピー コンストラクターを定義する場合は、operator= もオーバーロードする必要があります。

たとえば、http://www.learncpp.com/cpp-tutorial/911-the-copy-constructor-and-overloading-the-assignment-operator/を参照してください。

のようなことをするとx = Polygon(y)、コピー コンストラクタが呼び出されます (その後にデフォルトの が続きますoperator=)。ただし、この回避策を使用しないでください operator=

于 2013-03-04T08:30:56.310 に答える
1

あなたのPolygonクラスの問題は、で割り当てられた生の配列を格納するために使用される、への生のポインタverticesのように見えるデータメンバーがあることだと思います:Vertexnew[]

頂点 = 新しい頂点[aPolyToCopy.count];

operator=コピー コンストラクター ( The Rule of Threeを参照) だけでなく、(およびデストラクタも) オーバーロードする必要がある場合があります。クラスのすべてのコードを示していないPolygonため、適切なコピーの割り当てと破棄を定義したかどうかは明確ではありません。

のような堅牢な RAII コンテナ クラスを使用すると、コードが簡素化されることに注意してくださいstd::vectorstd::vector<Vertex> vertices;" " データ メンバの代わりに " " データ メンバをVertex* vertices追加するだけstd::vectorで、コピーやクリーンアップなどを処理してくれます。何もする必要はありません。すべて によって自動的に管理されstd::vectorます。

#include <vector>    // for std::vector

class Polygon
{
  std::vector<Vertex> vertices;

public:
  explicit Polygon(size_t vertexCount)
    : vertices(vertexCount) // Build a polygon with specified vertices
  {}

  //  
  // Compiler generated copy constructor, operator= and destructor are fine.
  //
};

std::vector一般に、C++ では、便利な RAII 構築ブロックやその他の直接的なリソース マネージャーを組み合わせてクラスを構築しようとします。

于 2013-03-04T08:38:28.843 に答える