C++ 如果stack.top()返回一个引用,那么为什么';这个代码不起作用吗?

C++ 如果stack.top()返回一个引用,那么为什么';这个代码不起作用吗?,c++,stl,struct,C++,Stl,Struct,我试图查看结构堆栈的顶部元素以更改其属性: stack<mat> stk; ... mat parent = stk.top(); parent.cap -= n; stack-stk; ... mat parent=标准顶部(); parent.cap-=n; 但这不会更改堆栈顶部的值。我认为这只是改变了副本的价值。相反,我不得不这样做(我不确定这是否正确,但它是有效的): stack-stk; ... mat*parent=&stk.top(); 父->上限-=n; 我在引

我试图查看结构堆栈的顶部元素以更改其属性:

stack<mat> stk;
...
mat parent = stk.top();
parent.cap -= n;
stack-stk;
...
mat parent=标准顶部();
parent.cap-=n;
但这不会更改堆栈顶部的值。我认为这只是改变了副本的价值。相反,我不得不这样做(我不确定这是否正确,但它是有效的):

stack-stk;
...
mat*parent=&stk.top();
父->上限-=n;

我在引用中读到,
stk.top()
返回对堆栈顶部元素的引用,那么为什么我的第一个示例不起作用呢?

这里,您正在将引用复制到一个新的
mat
对象中:

mat parent = stk.top();
如果要处理引用,请使用以下引用:

mat& parent = stk.top();

在这里,您正在将ref复制到一个新的
mat
对象中:

mat parent = stk.top();
如果要处理引用,请使用以下引用:

mat& parent = stk.top();
类mat似乎实现了一个操作符=以便可以从另一个对象值进行复制

这一行实际做的是返回对顶部对象的引用,然后将其数据复制到新在堆栈上创建的对象mat父对象

如果更改父值,它们将不会影响堆栈中的原始对象

上面的H2CO3是正确的:

mat &parent = stk.top(); // gives you a handle to your top stacked object
是解决您的用例的方法

类mat似乎实现了一个操作符=以便可以从另一个对象值进行复制

这一行实际做的是返回对顶部对象的引用,然后将其数据复制到新在堆栈上创建的对象mat父对象

如果更改父值,它们将不会影响堆栈中的原始对象

上面的H2CO3是正确的:

mat &parent = stk.top(); // gives you a handle to your top stacked object
是您用例的方法。

而不是这些代码

mat parent = stk.top();
parent.cap -= n;
你可以写得很简单

stk.top().cap -= n;
在第一种情况下,定义一个新的对象父对象,该父对象包含堆栈中对象状态的副本。

而不是这些代码

mat parent = stk.top();
parent.cap -= n;
你可以写得很简单

stk.top().cap -= n;

在第一种情况下,您定义了一个新的对象父对象,其中包含堆栈中对象状态的副本。

parent
不是引用…您还应该在调用端使用引用<代码>材料和父材料=标准顶部()…在这一点上,我想把这个初学者的错误归咎于使用过于口语化的语言:函数从不“返回引用”。相反,对函数调用表达式求值总是产生一个值,而值永远不是引用。区别在于函数的返回类型是否为引用,以及相应地产生的值是左值还是右值。这听起来更复杂,但避免了像这样的心理失误。谢谢你的澄清!我不知道我必须声明我的变量作为引用。我假设这就像Java中返回引用的函数一样,这是错误的。@Duncan Moral:永远不要假设。
parent
不是引用…您也应该在调用端使用引用<代码>材料和父材料=标准顶部()…在这一点上,我想把这个初学者的错误归咎于使用过于口语化的语言:函数从不“返回引用”。相反,对函数调用表达式求值总是产生一个值,而值永远不是引用。区别在于函数的返回类型是否为引用,以及相应地产生的值是左值还是右值。这听起来更复杂,但避免了像这样的心理失误。谢谢你的澄清!我不知道我必须声明我的变量作为引用。我假设这就像Java中返回引用的函数,这是错误的。@Duncan Moral:永远不要假设。