【问题标题】:I wrote operator* for singly linked list in c++. When I write what function contains in main, it works, but when I call the function, it doesn't [duplicate]我为 C++ 中的单链表编写了 operator*。当我编写 main 中包含的函数时,它可以工作,但是当我调用该函数时,它不会[重复]
【发布时间】:2021-01-22 09:10:15
【问题描述】:
Polynomial& Polynomial::operator*(double k) {

    Polynomial result;
    Node<double>*current = first;
    if (!current) {
        throw "Can't do this operation with empty polynomial. /n";

    }
    
    for (int i = 0; i < length(); i++) {
        result.insertAt(i, k*current->info);
        current = current->next;
    }
    return result;
}

// 函数 insertAt() 工作正常。

【问题讨论】:

标签: c++ linked-list operator-overloading singly-linked-list


【解决方案1】:
Polynomial result;

在此函数中定义了一个名为 result 的局部变量。与所有其他局部变量一样,当此函数返回时,它将被销毁并且将不再存在。这就是局部函数变量在 C++ 中的工作方式。

return result;

这个函数被声明为返回一个对象的引用。此return 语句返回对result 的引用。但是,由于从函数返回 result 会同时被销毁。此函数返回对已销毁对象的引用,并且使用此引用会导致未定义的行为。这是您看到的异常行为的解释。

此函数不应返回引用,而应按值返回对象。希望Polynomial 完全是Rule Of 3 compliant 并具有适当的复制构造函数和赋值运算符,以便正确发生。

附:大多数现代 C++ 编译器完全能够检测到这个明显的常见错误。如果您的编译器发出诊断消息并警告您,这是一个教训,永远不要忽略来自编译器的警告消息,即使它成功编译了您的程序。您的编译器希望帮助您编写正确的代码。始终验证您的程序是否在没有来自 C++ 编译器的任何诊断消息的情况下进行编译。来自编译器的警告消息,即使程序已编译,也往往表明代码中存在真正的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-13
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多