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:永远不要假设。