我有这个代码用于复制多边形类。我遇到的问题是,最后顶点指向原始的多边形类位置。由于似乎没有调用复制构造函数。那是为什么?
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 );
};
答案 0 :(得分:3)
您正在执行作业,不构建新对象。如果您定义自定义复制构造函数,还需要重载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构建块组合在一起的类。