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

你正在做一个assignment,你没有在这里构造一个新对象。如果定义了自定义的拷贝构造函数,还需要重载 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数据成员,它似乎是指向 a 的原始指针Vertex,用于存储分配有的原始数组new[]

顶点 = 新顶点[aPolyToCopy.count];

您可能还需要重载operator=(和析构函数),而不仅仅是复制构造函数(请参阅三法则);你还没有展示你Polygon班级的所有代码,所以不清楚你是否定义了正确的复制分配和销毁。

请注意,如果您使用健壮的 RAII 容器类(如std::vector. 只需添加一个 " std::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.
  //
};

通常,在 C++ 中尝试构建将方便的 RAII 构建块(如std::vector和其他直接资源管理器)组装在一起的类。

于 2013-03-04T08:38:28.843 回答