为什么不调用复制构造函数?

时间:2013-03-04 08:27:10

标签: c++ templates copy-constructor

我有这个代码用于复制多边形类。我遇到的问题是,最后顶点指向原始的多边形类位置。由于似乎没有调用复制构造函数。那是为什么?

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 );
};

2 个答案:

答案 0 :(得分:3)

您正在执行作业不构建新对象。如果您定义自定义复制构造函数,还需要重载operator =

例如,请参阅http://www.learncpp.com/cpp-tutorial/911-the-copy-constructor-and-overloading-the-assignment-operator/

如果您要执行x = Polygon(y)之类的操作,则会调用您的复制构造函数(后跟默认的operator=)。但请不要使用此解决方法,只需提供您的operator=

答案 1 :(得分:1)

我认为Polygon类中的一个问题是你有一个vertices数据成员,它似乎是一个原始指针Vertex,用于存储分配有new[]原始数组

  

vertices = new Vertex [aPolyToCopy.count];

您可能还需要重载operator=(和析构函数),而不仅仅是复制构造函数(请参阅The Rule of Three);您没有显示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 ++中,尝试构建将诸如std::vector和其他直接资源管理器等方便的RAII构建块组合在一起的类。