2013-11-24 37 views
0

我想偷看我的結構體堆棧的頂部元素,以改變其屬性:如果stack.top()返回一個引用,那爲什麼這個代碼不工作?

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

但這並不在堆棧的頂部更改值。我認爲這只是改變了副本的價值。相反,我不得不做這樣的事情(我不知道這是否是正確的,但它的工作原理):

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

我在參考閱讀stk.top()在堆棧的頂部返回元素的引用,那麼爲什麼我的第一個例子沒有工作?

+4

'parent'不是參考... –

+1

你應該在調用端使用一個引用以及...'mat&parent = stk.top();'... – 2013-11-24 20:59:24

+1

在這一點上,我會就像爲這個初學者的錯誤指責使用過分口語的語言:函數從來沒有「返回引用」。相反,*評估一個函數調用表達式總是會產生一個值*,而這些值永遠不會是引用。區別在於函數的返回*類型*是否是引用,並相應地產生的值是左值還是右值。這聽起來更復雜,但避免了這樣的心理失誤。 –

回答

6

在這裏,你會複製你的裁判到一個新的mat對象:

mat parent = stk.top(); 

如果你想在工作的參考,使用這樣的參考:

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

類墊似乎有一個operator =實現,以便它可以從另一個對象值複製。

這一行實際上做了什麼是返回對頂部對象的引用,然後將其數據複製到堆棧上新創建的對象庫父對象上。

如果更改父值,它們將不會影響堆棧中的原始對象。上述

H2CO3是正確的:

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

是去爲你的使用情況的方式。

0

代替這些代碼

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

你可以寫簡單

stk.top().cap -= n; 

在您定義包含在堆棧中的對象的狀態的副本的新對象的父尚屬首例。

相關問題