如何将单个链接列表的push_front()
方法实现为成员函数?下面的代码无法编译(error: lvalue required as left operand of assignment
),因为您无法分配给this
指针。这是什么方式?
#include<algorithm>
using namespace std;
class ListElem{
public:
ListElem(int val): _val(val){}
ListElem *next() const { return _next; }
void next(ListElem *elem) { _next = elem; }
void val(int val){ _val = val; }
int val() const { return _val;}
void print();
void push_front(int);
private:
ListElem *_next;
int _val;
};
void ListElem::push_front(int val)
{
ListElem *new_elem = new ListElem(val); //new node
new_elem->next( this ); // new node points to old head
this = new_elem; // make new node the new head, error!
return;
}
void ListElem::print()
{
ListElem *pelem = this;
while(ListElem *pnext_elem = pelem->next())
{
cout << pelem->val() << ' ';
pelem = pnext_elem;
}
cout << pelem->val() << endl;
}
int main()
{
//initialization
ListElem *head = new ListElem(1);
ListElem *elem = head;
for (int ix = 2; ix < 10; ++ix)
{
ListElem *elem_new = new ListElem(ix);
elem -> next(elem_new);
elem = elem_new;
}
head->print();
//insert at the beginning
head->push_front(7);
head->print();
}
答案 0 :(得分:2)
逻辑上,push_front()必须是List
类的方法,而不是ListElement
类的方法
答案 1 :(得分:1)
您错误地使用了this
。您希望static
成员被调用,例如ListElem *head
,并在您使用this
的位置使用该成员。你还需要初始化它。
答案 2 :(得分:1)
如果你真的想这样做,你可以这样做:
void ListElem::push_front(int val)
{
ListElem *new_elem = new ListElem(_val);
_val = val;
new_elem->next(_next);
_next = new_elem;
}
这将用新数据替换“当前”节点中的数据,并将“当前”数据移动到新节点,这将产生相同的列表内容。
但是将列表与其节点混淆是不正确的。
你链接的书采用非OO方法处理整个事情(Java和C ++示例看起来都像音译C),并且将列表类型与其节点类型混淆在一起非常肯定会导致以后的bug。
例如,如果你这样做
ListElem* x = head;
head->push_front(99);
然后*x
的内容会发生变化,这并不是你所期望的。