gpt4 book ai didi

c++ - 重载 operator+ 时的区别

转载 作者:行者123 更新时间:2023-11-27 23:19:08 26 4
gpt4 key购买 nike

当我重载 operator+ 时发生了一些奇怪的事情

我有一个单链表,我重载了 operator+ 和 operator=

这是我对两者的实现(编辑:使用 insertFront 和复制构造函数):

 AnyList::AnyList(const AnyList& list)
{
count = list.getCount();
first = list.getFirst();
AnyList a;
a.setFirst(first);
a.setCount(count);

Node *current = first;
for (int i = 0; i < count; ++i)
{
a.insertFront(current->getData());
current = current ->getLink();
}
}

-

      void AnyList::insertFront(int value)
{
Node *newNode = new Node;
newNode -> setData(value);
newNode -> setLink(first);
first = newNode;
++count;
}

AnyList AnyList::operator+ (const AnyList& list) const
{

Node *current = first;
Node *listCurrent = list.getFirst();

int sumHolder = 0;
AnyList temp;
while(current != NULL)
{
sumHolder = current ->getData() + listCurrent ->getData();
temp.insertFront(sumHolder);
current = current ->getLink();
listCurrent = listCurrent ->getLink();
}

return temp;
}


AnyList& AnyList::operator=(const AnyList& rightSide)
{

if(&rightSide != this)
{
Node *travel = rightSide.getFirst();

first = rightSide.getFirst();

Node *original = first;

while (travel != NULL)
{
original ->setData(travel ->getData());
original ->setLink(travel ->getLink());
travel = travel->getLink();
original = original ->getLink();
}
}

return *this;
}

主要内容如下:

AnyList mylist;
AnyList mylist2;

for (int i = 0; i < 10; ++i)
{
mylist.insertFront(i);
}
for (int i = 10; i < 20; ++i)
{
mylist2.insertFront(i);
}

mylist.print();
cout << endl << endl;
mylist2.print();
cout << endl;
AnyList sumList = mylist + mylist2;
sumList.print();
cout << endl;

我的输出如下(这是我想要的输出):

    9 8 7 6 5 4 3 2 1 0 

19 18 17 16 15 14 13 12 11 10

10 12 14 16 18 20 22 24 26 28

所以,我的问题是,当我改写时:

    AnyList sumList;
sumList = mylist + mylist2;
sumList.print();

当它进入打印函数并尝试从函数 getData() 返回数据时,我遇到了访问错误

我完全不知道为什么会这样,任何帮助将不胜感激!

谢谢!

最佳答案

mylist + mylist2 创建一个临时的,它的析构函数在完整表达式的末尾被调用。您的赋值运算符执行浅拷贝,因此如果调用临时对象的析构函数释放内存,sumList 现在将有悬空指针。

阅读有关如何进行深拷贝的信息。

要对此进行测试,您可以暂时删除析构函数。不过只是为了测试 - 如果您正在管理资源,您将需要它。

关于c++ - 重载 operator+ 时的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14588139/

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