han*_*nie 0 c++ linked-list this
我是 C++ 的初学者。我正在写一个link list我可以调用我的函数来插入这样的节点:
(假设a和b和c的,我想插入数据link list。
list.insert(a)->insert(b)->insert(c);
Run Code Online (Sandbox Code Playgroud)
我是这样做的:
#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;
}
Run Code Online (Sandbox Code Playgroud)
在我的insertNewNode函数中,我返回一个指向当前对象的指针。它工作正常,但是我不确定我的方法是否正确?
但是我也应该解释一下会发生什么,如果不是返回对当前对象的指针或引用,而是返回当前对象。
所以我试过这个:
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;
}
Run Code Online (Sandbox Code Playgroud)
然后我收到一个错误,说list应该是一个指针,所以我把我的 main 改为:
int main() {
link_list *list;
list = new link_list;
list->insertNewNode('a')->insertNewNode('b')->insertNewNode('c');
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但我仍然收到这个错误,它说这里的list->insertNewNode('a')->insertNewNode('b')->insertNewNode('c'); 表达式必须有一个指针类型和这两个错误:
1.type 'link_list' 没有重载成员 'operator ->'
2.'->link_list::insertNewNode':左操作数为'class'类型,使用'.'
所以这是我的问题,目的是像这样调用插入函数list.insert(p1)->insert(p2)->insert(p3);,我在第一个程序中的方式对吗?甚至有可能为此目的返回我当前的对象吗?如果我返回当前对象会发生什么?
PS:很抱歉问了很长的问题,并提前感谢您的帮助。
好吧,您当前的方法返回指针没有任何犯罪行为。不是经常做的事情,仍然可以编译。
更惯用的是通过引用返回当前对象:
link_list &insert(char elem) {
return *this;
}
Run Code Online (Sandbox Code Playgroud)
您最初的问题是您更改了方法的返回类型,但保留->在main(). 如果您将insert的返回类型更改为从指针引用,那么链式调用应该通过 完成.,因为您正在使用对象和对它们的引用,而不是指针。
从 setter 返回当前对象的副本不是应该做的事情,特别是如果您自己管理私有资源并且还没有定义正确的复制构造函数。而是返回一个引用。