gpt4 book ai didi

c++ - 你能从另一个方法调用复制构造函数吗?

转载 作者:太空宇宙 更新时间:2023-11-04 15:10:39 25 4
gpt4 key购买 nike

/** @file ListP.cpp
* ADT list - Pointer-based implementation. */

#include <iostream>
#include <cstddef> // for NULL
#include <new> // for bad_alloc
#include "ListP.h" // header file

using namespace std;

List::List() : size(0), head(NULL)
{
} // end default constructor

List::List(const List& aList) : size(aList.size)
{
if (aList.head == NULL)
head = NULL; // original list is empty

else
{ // copy first node
head = new ListNode;
head->item = aList.head->item;

// copy rest of list
ListNode *newPtr = head; // new pointer
// newPtr points to last node in new list
// origPtr points to nodes in original list
for (ListNode *origPtr = aList.head->next; origPtr != NULL; origPtr = origPtr->next)
{
newPtr->next = new ListNode;
newPtr = newPtr->next;
newPtr->item = origPtr->item;
} // end for

newPtr->next = NULL;
} // end if
} // end copy constructor

void List::copy(const List& aList)
{
List::List(aList);
} // end copy

我正在尝试创建一个名为 copy 的方法,它只调用复制构造函数。当我在 main 中测试这个方法时,目标列表仍然是空的。我已经逐步完成并执行了所有正确的行,但是当复制构造函数返回时似乎没有任何内容被保存。我觉得这与范围有关,但无法查明问题所在。这是驱动程序:

#include <iostream>
using namespace std;

#include "ListP.h"

int main ()
{
List aList;

ListItemType dataItem;
aList.insert(1, 9);
aList.insert(2, 4);
aList.insert(3, 1);
aList.insert(4, 2);

List bList;
bList.copy(aList);

bList.retrieve(1, dataItem);
cout << dataItem << endl;
cout << bList.getLength() << endl;

return 0;
}

最佳答案

如果我理解你的问题,你就不能做你想做的事。

在您可以调用对象上的任何其他方法之前,必须完全构造该对象(这里有一个异常(exception),我会回过头来)。此外,一个对象只能构造一次 (*)。因此,当您可以调用复制方法时,对象已经构造完成,您不能(也不应该)再次构造它。

无法在未完全构造的对象(即构造函数尚未返回)上调用方法的一个异常(exception)是构造函数本身可以在部分构造的对象上调用方法。因此,您可以从复制构造函数调用复制方法,但反之则不行。

也就是说,如果你的对象提供了一个优化的交换功能,有一个标准的技巧可能会想到:

void List::copy(const List& aList)
{
List acopy(aList);
swap(*this, acopy);
}

这会创建一个 aList 的拷贝,然后用这个拷贝交换对象的当前内容。现在包含您之前列表内容的拷贝将在拷贝返回时被正确销毁。

最后,如果你打算这样做,目前的建议实际上是稍微调整一下并这样写:

void List::copy(List aList)
{
swap(*this, aList);
}

在某些情况下,这会更有效(而且绝不会降低效率)。

* - 你可以做一些奇怪的事情,并使用 placement new 构造一个对象两次。但没有充分的理由这样做,也有很多不这样做的理由。

关于c++ - 你能从另一个方法调用复制构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2032654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com