从链表程序中的 insert_node 函数返回指向我当前对象的指针或引用

Returning a pointer or reference to my current object from a insert_node function in a linked list program

我是 C++ 的初学者。我正在写一个 link list ,我可以在其中调用我的函数来插入这样的节点:

(假设 abc 是我要插入 link list 的数据。

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;
}

在我的 insertNewNode 函数中,我 return 指向我当前 object.and 它工作正常,但我不确定我的方法是否正确?

但我还应该解释发生了什么,如果不是 return 指向我当前对象的指针或引用,我 return 我当前对象。

所以我尝试了这个:

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.type 'link_list' does not have an overloaded member 'operator ->'

2.'->link_list::insertNewNode': left operand has 'class' type, use '.'

所以这是我的问题,目的是像这样调用插入函数 list.insert(p1)->insert(p2)->insert(p3);,我在第一个程序中的方法正确吗?甚至可以 return 我当前的对象用于此目的吗?如果我 return 当前对象会发生什么?

PS:很抱歉问题很长,也提前感谢您的帮助。

  1. 好吧,您当前使用指针的方法 return 没有任何犯罪行为。不是经常做的事情,仍然可以编译。

  2. 更惯用的是 return 当前对象的引用:

link_list &insert(char elem) {
    return *this;
}
  1. 您最初的问题是您更改了方法的 return 类型,但在 main() 中保留了 ->。如果您将 insert 的 return 类型更改为从指针引用,那么链式调用应该通过 . 完成,因为您正在处理对象和对它们的引用,而不是指针。

  2. 从 setter 返回当前对象的副本不是应该做的事情,特别是如果你自己管理私有资源并且还没有定义合适的复制构造函数.而是 return 参考。

你的方法看起来不错。你正在做

link_list* insertNewNode(char) {
  // ...
  return this;
}

这样你就可以像这样链接插入

list.insertNewNode('a')->insertNewNode('b')->insertNewNode('c'); 

您还可以 return 引用 link_list,像这样

link_list& insertNewNode(char) {
  // ...
  return *this;
}

现在链接插入看起来像这样

list.insertNewNode('a').insertNewNode('b').insertNewNode('c'); 

请注意,您不应该这样做

link_list insertNewNode(char) {
  // ...
  return *this;
}

因为这会编译,但是您将return复制链接列表,链接将根本不起作用。

如果你的节点将被添加到尾部,默认的复制构造函数会使它看起来就像链接工作一样,因为原来的link_list会看到所有Nodes 添加到副本中。

在您的实施中,您在头部添加 Nodes,因此原始 link_list 没有看到 Nodes 添加到副本中,因此链接不会似乎工作。这很好,因为副本会泄漏它们分配的内存,即使您编写了适当的析构函数。