请帮助我理解运算符重载=链表c ++

时间:2015-11-18 06:09:32

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

我有这样的结构 -

struct IntNode
{
    int data;                   
    IntNode * next;         
};

并在课堂上 -

    class NodeSLList {
    private:``
        IntNode *head, *tail;
//some other functions
    }

我有一个对象list1,其中包含几个节点的链表。我必须从list2创建另一个链接列表list1。 如何使用函数

实现此目的
NodeSLList & operator=(NodeSLList &list){}

我无法查明如何访问list2内部的=函数,因为我将list1内部传递给像

list2=list1; 

如何访问list2 ??

4 个答案:

答案 0 :(得分:1)

this将成为左操作数的指针,在您的情况下为list2。要获取list2本身,只需使用解除引用运算符*取消引用它。即*this

答案 1 :(得分:1)

请记住,this指针指向您正在操作的退出类,因此,this->head或简称head是您要更改的旧列表的成员,并且newList.head是您必须分配的新列表的成员。

NodeSLList & operator=(NodeSLList &newList)
{
        //Check if there is something to free?
        if(head != NULL) //this->head != NULL
        {                    
                //free head
        } 
        //Assign new one
        head = newList.head; //this->head = newList.head;
        //Other stuff if any
        return this;
}

答案 2 :(得分:1)

答案是*this

反正。请不要实现自己的链表。已经存在std::list,或者如果您需要双重链接列表std::deque。您需要付出很多努力才能使您的代码与标准库一样高质量,更不用说定义一个同样经过深思熟虑的界面。

所以,如果这是你的四所学校,请编写自己的链表。我们都这样做了。这是用指针练习编程的好方法。但请抵制后来在生产代码中做类似事情的诱惑。我经常看到它,而且大部分时间都是缓慢而低效的,而且通常还有很多错误。

答案 3 :(得分:0)

函数(运算符)NodeSLList list2; list2 = list1; 称为copy assignment operator。它不会创建新对象,而是分配给它们。所以对于你的第一个问题

  

我必须从list1创建另一个链表list2。我如何能   使用函数实现这一点......

答案是;你没有。首先,您创建一个新对象list2 = list1;,然后您可以分配给它。以下代码将首先调用默认构造函数,然后调用复制赋值运算符:

list2.operator=(list1);

所以实际上operator=

的简写
*this

或许这更清楚地表明函数NodeSLList list2 = list1;用于现有对象,并且正如所有其他答案所指出的那样,您可以通过public class IPToRangeUDF extends UDF { ... ... public String evaluate(String ip,Integer option) throws Exception{ ... ... } } 访问此对象。

顺便说一句,如果你写了ADD JAR <jar path here>/myJAR.jar; CREATE TEMPORARY FUNCTION ipToRange AS 'IPToRangeUDF'; ,你会打电话给copy constructor,这是另一个故事......