如果stack.top()返回一个引用,那么为什么这段代码不起作用呢?

时间:2013-11-24 20:58:00

标签: c++ stl struct

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

stack<mat> stk;
...
mat parent = stk.top();
parent.cap -= n;

但这不会改变堆栈顶部的值。我认为这只是改变副本的价值。相反,我必须做这样的事情(我不确定它是否正确,但它有效):

stack<mat> stk;
...
mat * parent = &stk.top();
parent->cap -= n;

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

3 个答案:

答案 0 :(得分:6)

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

mat parent = stk.top();

如果您想使用引用,请使用如下引用:

mat& parent = stk.top();

答案 1 :(得分:1)

mat parent = stk.top(); // Will only copy the data into a new object 

类mat似乎有一个operator =实现,以便它可以从另一个对象值复制。

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

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

上面的H2CO3是对的:

mat &parent = stk.top(); // gives you a handle to your top stacked object

是您使用案例的方法。

答案 2 :(得分:0)

而不是这些代码

mat parent = stk.top();
parent.cap -= n;

你可以写简单

stk.top().cap -= n;

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