尝试在链表中编辑节点,"下一个节点"在我的节点类的私有部分内,我添加了一个方法,只返回节点*在公共为了编辑它时,我需要,我得到一个错误,它是可修改的。
在我将下一个节点指针移动到私有部分之前,它是在我的公共部分内部并工作了,我不明白直接编辑"node * next"或编辑"node * getNext()"之间的区别是什么,它返回完全相同的东西,节点* next。
下面是一些相关的代码:
类节点;
//Node class
class Node
{
private:
Client* client;
Node* next;
public:
Node();
Node(Client*);
Node(Client*,Node*);
~Node();
Client* getClient();
Node* getNext();
};
//end of Node class
getter:
Client* MatchmakingAgency::Node::getClient(){
return client;
}
MatchmakingAgency::Node* MatchmakingAgency::Node::getNext(){
return next;
}
和返回错误的函数:(第二行)
void MatchmakingAgency::addNode(Client* data){
(nodeTail->getNext()) = new Node(data);
nodeTail = nodeTail->getNext();
}
错误信息:
错误1错误C2106: '=':左操作数必须为左值
返回数据成员的副本,由于它是内置类型,因此不能修改它。如果你想通过"getter"修改一个数据成员,你需要返回对该成员的引用:
Node*& getNext();
通常的做法是为这类成员函数提供const
重载:
const Node*& getNext() const;
当然,这引出了一个问题:为什么不使用公共数据成员呢?将成员设为私有可能有很好的理由,但这一点值得考虑。如果您不维护任何不变量,或者遵循某些"接口",或者认为不需要提供一些重要的访问方法实现,则可以使用公共数据成员。
错误是getter返回下一个ptr的副本。如果你像刚才那样修改下一个指针的拷贝
(nodeTail->getNext()) = new Node(data);
你修改错了。
解决这个问题的方法(实际上是一种hack)是尝试更改getNext以返回实际的下一个引用:
MatchmakingAgency::Node*& MatchmakingAgency::Node::getNext(){
return next;
}
正如MSDN的链接(http://msdn.microsoft.com/en-IN/library/f90831hc.aspx)所说:
左值指的是在单个表达式之外持续存在的对象。你可以把左值想象成一个有名字的对象。所有变量,包括不可修改(const)变量,都是左值。
call
(nodeTail->getNext()) = new Node(data);
语法错误,因为表达式是
(nodeTail->getNext())
不是左值,因为您将函数声明为
Node* getNext();
。为了使它成为左值,你必须使用左值引用声明符:&来使它成为左值,即
将getter定义为
Node*& getNext();
要了解更多关于左值的信息,请参阅此stackoverflow链接:
什么是右值、左值、左值、右值和右值?