无法通过 get 方法编辑私有变量(必须是可修改的左值)



尝试在链表中编辑节点,"下一个节点"在我的节点类的私有部分内,我添加了一个方法,只返回节点*在公共为了编辑它时,我需要,我得到一个错误,它是可修改的。

在我将下一个节点指针移动到私有部分之前,它是在我的公共部分内部并工作了,我不明白直接编辑"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链接:

什么是右值、左值、左值、右值和右值?

最新更新