从链表程序中的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如果您链接调用并通过副本返回,那么除了第一个节点外,链中的所有调用都将应用于副本,而不是实际对象。“因为这将进行编译,但您将返回链接列表的副本,而链接根本不起作用。”在当前代码中,正如本文所述,由于没有释放(泄漏)任何分配的内存,链接似乎与返回引用时一样有效。不,它打印相同的答案。抱歉,我不明白如果我的节点添加到尾部,为什么更改会起作用?更改看起来只起作用。理解这一点的最好方法是画出每行代码的作用。