类复制操作,它是如何工作的
Class Copy Operation, how it works?
我有一个名为QuadTree的类。我最近为它创建了一个复制构造函数,即:
QuadTree(const QuadTree &cpy);
例如,假设我还没有填写这个构造函数。只要不使用,代码就可以编译。现在,我有一个名为 subtractTrees 的函数:
QuadTree * subtractTrees(QuadTree LHS, QuadTree RHS);
在制作复制构造函数之前,这段代码工作得很好。现在,当使用此函数编译程序时,我收到以下错误:
Undefined Referance to QuadTree::QuadTree(QuadTree const&)
就像由于我的复制构造函数在代码中使用并且尚未填写而发生的错误一样。这是否意味着现在我有一个复制构造函数调用这样的被动函数(减去树(将调用复制构造函数?
如果是这样,有没有办法在仍然使用复制构造函数的同时阻止这种情况发生?我需要这样做的原因是,复制用于这样的函数会大大减慢我的代码速度。但是我需要复制构造函数来轻松复制树。
编辑:我只需填写复制构造函数即可修复错误,但问题更多是关于
- 首先,如果没有复制构造函数,它是如何工作的。
- 如果试图通过每次使用树时不复制树来节省速度,有没有办法利用这种不需要复制构造函数的方法?
为类QuadTree
定义一个构造函数,当你这样做时,编译器不会生成隐式复制构造函数,它会假设你将提供自己的构造函数,如果你需要它。
当您添加函数时,该函数按值QuadTree
类型,需要复制构造函数来执行这些副本,因此编译器会抱怨。
QuadTree * subtractTrees(QuadTree LHS, QuadTree RHS);
^^^^^^^^^^^^ ^^^^^^^^^^^^^
按值传递需要复制构造函数。
如果是这样,有没有办法在仍然使用复制构造函数的同时阻止这种情况发生?
我不确定我是否理解这个问题。如果要创建类对象的副本,则需要复制构造函数。如果要避免副本通过 const 引用传递对象。
QuadTree * subtractTrees(const QuadTree &LHS, const QuadTree &RHS);
当你没有声明复制构造函数时,编译器隐式地为你提供了一个,这就是你的代码以前工作的原因。由于您按值将QuadTree
传递给subtractTrees
,因此在您声明自己的复制构造函数之前调用了此隐式复制构造函数。一旦你声明(但没有定义(你自己的复制构造函数,编译器就停止隐式定义复制构造函数,因此之前对复制构造函数的所有调用(例如在subtractTrees
函数中(都会产生未定义的引用。
如果你想避免在subtractTrees
函数中复制,你可以通过引用传递参数:
QuadTree * subtractTrees(const QuadTree &LHS, const QuadTree &RHS);
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个