从链表程序中的insert_节点函数返回指向当前对象的指针或引用 我是C++初学者。我正在编写一个链接列表,在其中我可以调用我的函数来插入如下节点: #include <iostream> using namespace std; class Node { public: char letter; Node* next; }; class link_list { private: Node* head; public: link_list() { head = NULL; } link_list* insertNewNode(char item); }; link_list* link_list::insertNewNode(char item) { Node* temp; temp = new Node; temp->letter = item; temp->next = head; head = temp; return this; } int main() { link_list list; list.insertNewNode('a')->insertNewNode('b')->insertNewNode('c'); return 0; }

从链表程序中的insert_节点函数返回指向当前对象的指针或引用 我是C++初学者。我正在编写一个链接列表,在其中我可以调用我的函数来插入如下节点: #include <iostream> using namespace std; class Node { public: char letter; Node* next; }; class link_list { private: Node* head; public: link_list() { head = NULL; } link_list* insertNewNode(char item); }; link_list* link_list::insertNewNode(char item) { Node* temp; temp = new Node; temp->letter = item; temp->next = head; head = temp; return this; } int main() { link_list list; list.insertNewNode('a')->insertNewNode('b')->insertNewNode('c'); return 0; },c++,linked-list,this,C++,Linked List,This,(假设a和b和c是我要插入链接列表中的数据 list.insert(a)->insert(b)->insert(c); 我是这样做的: #include <iostream> using namespace std; class Node { public: char letter; Node* next; }; class link_list { private: Node* head;

(假设
a
b
c
是我要插入
链接列表中的数据

list.insert(a)->insert(b)->insert(c);
我是这样做的:

#include <iostream>
using namespace std;

class Node {
public:
    char letter;                     
    Node* next;     
};

class link_list {

private:
    Node* head;       
public:

    link_list() {             
        head = NULL;
    }
    link_list* insertNewNode(char item);
};


link_list* link_list::insertNewNode(char item) {
    Node* temp;
    temp = new Node;
    temp->letter = item;
    temp->next = head;
    head = temp;
    return this;
}

int main() {

    link_list list;
    list.insertNewNode('a')->insertNewNode('b')->insertNewNode('c');
    return 0;
}
然后我收到一个错误,上面说
list
应该是一个指针,所以我将main改为:

int main() {

    link_list *list;
    list = new link_list;
    list->insertNewNode('a')->insertNewNode('b')->insertNewNode('c');
    return 0;
}
但是我仍然收到这个错误,它说这里
list->insertNewNode('a')->insertNewNode('b')->insertNewNode('c');
表达式必须有一个指针类型,这两个错误:

1.类型“链接列表”没有重载的成员“运算符->”

2'->link_list::insertNewNode':左操作数具有“class”类型,请使用“.”

下面是我调用insert函数的问题,比如
列表。insert(p1)->insert(p2)->insert(p3);
,我在第一个程序中的方式正确吗?甚至可以为此返回我的当前对象吗?如果我返回当前对象会发生什么

PS:很抱歉提出了这么长的问题,同时也提前感谢您的帮助

  • 好吧,在你当前返回指针的方法中没有什么不好的地方。不是经常做的事情,仍然是可编译的

  • 更惯用的方法是通过引用返回当前对象:

  • 链接列表和插入(字符元素){
    归还*这个;
    }
    
  • 您最初的问题是您更改了方法的返回类型,但在
    main()
    中保留了
    ->
    。如果您将
    insert
    的返回类型更改为从指针引用,那么链接调用应该通过
    完成,因为您正在处理对象和对它们的引用,而不是指针

  • 从setter返回当前对象的副本不是应该做的事情,特别是如果您自己管理私有资源,并且还没有定义正确的副本构造函数,则更应该返回引用


  • 你的方法似乎很好,你在做什么

    link_list* insertNewNode(char) {
      // ...
      return this;
    }
    
    这样就可以像这样链接插入

    list.insertNewNode('a')->insertNewNode('b')->insertNewNode('c'); 
    
    link_list& insertNewNode(char) {
      // ...
      return *this;
    }
    
    list.insertNewNode('a').insertNewNode('b').insertNewNode('c'); 
    
    您还可以返回对
    链接列表的引用,如下所示

    list.insertNewNode('a')->insertNewNode('b')->insertNewNode('c'); 
    
    link_list& insertNewNode(char) {
      // ...
      return *this;
    }
    
    list.insertNewNode('a').insertNewNode('b').insertNewNode('c'); 
    
    现在链接插入项看起来是这样的

    list.insertNewNode('a')->insertNewNode('b')->insertNewNode('c'); 
    
    link_list& insertNewNode(char) {
      // ...
      return *this;
    }
    
    list.insertNewNode('a').insertNewNode('b').insertNewNode('c'); 
    
    注意,你不应该做类似的事情

    link_list insertNewNode(char) {
      // ...
      return *this;
    }
    
    因为这将进行编译,但您将返回链接列表的副本,而链接将根本不起作用

    如果将节点添加到尾部,则默认的复制构造函数将使其看起来好像链接工作一样,因为原始的
    链接列表将看到所有
    节点添加到副本中


    在您的实现中,您正在头部添加
    节点
    ,因此原始链接列表不会看到添加到副本中的
    节点
    ,因此链接似乎不起作用。这很好,因为即使您编写了适当的析构函数,副本也会泄漏它们分配的内存。

    从技术上讲,在代码中写入:ev由于没有释放(泄漏)任何分配的内存,返回副本似乎可以正常工作。:@AlgirdasPreidžius在此通过复制工作返回。因此,如果我是对的,则只会添加第一个节点,因为我使用的是引用调用方法,但对于其他节点,我使用的是值调用方法,这意味着我的列表将只有一个节点,而其他节点不会被添加到列表中?@hanie如果您链接调用并通过副本返回,那么除了第一个节点外,链中的所有调用都将应用于副本,而不是实际对象。“因为这将进行编译,但您将返回链接列表的副本,而链接根本不起作用。”在当前代码中,正如本文所述,由于没有释放(泄漏)任何分配的内存,链接似乎与返回引用时一样有效。不,它打印相同的答案。抱歉,我不明白如果我的
    节点添加到尾部,为什么更改会起作用?更改看起来只起作用。理解这一点的最好方法是画出每行代码的作用。