2

我有一个名为 QuadTree 的类。我最近为它创建了一个复制构造函数,即:

QuadTree(const QuadTree &cpy);

比如说我还没有填写这个构造函数。只要不使用它,代码就可以编译得很好。现在,我有一个名为subtractTrees 的函数:

QuadTree * subtractTrees(QuadTree LHS, QuadTree RHS);

在制作复制构造函数之前,这段代码工作得很好。现在,使用此函数编译程序时,出现以下错误:

Undefined Referance to QuadTree::QuadTree(QuadTree const&)

就像由于我的复制构造函数在代码中使用并且尚未填写而发生的错误一样。这是否意味着现在我有一个复制构造函数调用像这样的被动函数(subtractTrees)将调用复制构造函数?

如果是这样,有没有办法在仍然使用复制构造函数的同时阻止这种情况发生?我需要这样做的原因是复制用于这样的函数会大大减慢我的代码。但我需要复制构造函数来轻松复制树。

编辑:我只是通过填写复制构造函数来修复错误,但问题更多的是关于

  1. 首先,如果没有复制构造函数,它是如何工作的。
  2. 如果有人试图通过不每次使用树时都复制树来节省速度,有没有一种方法可以利用这种不需要复制构造函数?
4

2 回答 2

4

您必须为您的类定义一个构造函数QuadTree,当您这样做时,编译器不会生成隐式复制构造函数,它假定您将在需要时提供自己的构造函数。

当您添加QuadTree按值获取类型的函数时,需要复制构造函数来执行这些复制,因此编译器会抱怨。

QuadTree * subtractTrees(QuadTree LHS, QuadTree RHS);
                         ^^^^^^^^^^^^  ^^^^^^^^^^^^^

按值传递需要复制构造函数。

如果是这样,有没有办法在仍然使用复制构造函数的同时阻止这种情况发生?

我不确定我是否理解这个问题。如果要创建类对象的副本,则需要一个复制构造函数。如果您想避免副本通过 const 引用传递您的对象。

QuadTree * subtractTrees(const QuadTree &LHS, const QuadTree &RHS);
于 2012-05-10T04:19:33.637 回答
1

当您没有声明复制构造函数时,编译器会为您隐式提供一个,这就是您的代码以前可以工作的原因。由于您QuadTree通过值传递给subtractTrees,因此在您声明自己的复制构造函数之前调用了此隐式复制构造函数。一旦您声明(但未定义)您自己的复制构造函数,编译器就会停止隐式定义复制构造函数,因此之前对复制构造函数的所有调用(例如在您的subtractTrees函数中)都会产生未定义的引用。

如果您想避免subtractTrees函数中的副本,您可以通过引用传递参数:

QuadTree * subtractTrees(const QuadTree &LHS, const QuadTree &RHS);
于 2012-05-10T04:30:14.653 回答