2012-12-29 184 views
1

我在名爲Man的類中有一個名爲update的方法。在我的main.cpp中我打電話:將變量傳遞給類方法

int age=0; 
Man person; 
person.Update(age); 

這會更新方法中的人的年齡。但是,當我回到主文件時,它沒有更新的年齡。所以變量是在類方法中設置的,但沒有回到main.cpp上下文。

EDIT

Man::Update(int age) 
{ 
    age++; 
} 
+0

我們需要查看「person :: update」的代碼 –

+0

Update()是否需要引用?我猜不是。 – JasonD

+0

你是指什麼意思? – joncodo

回答

3

對於一個變量的改變將被反射回在呼叫範圍,對變量的引用必須被傳遞給函數。當通過引用時,函數範圍中的變量有效地指/調用範圍中的變量。

Man::Update(int &age) //The ampersand reflects that it is a reference 
{ 
    age++; 
} 

你在做什麼叫做傳值。在這種情況下,變量的新副本將在函數作用域中創建,並且所做的任何更改都不會反映回調用作用域中。

看看這個detailed explanation和這個爲Q&A style explanation

但是,您在這種特定情況下所做的事情,根本不需要類或成員函數。它可以使用單個正常的函數完成。

3
void Man::Update(int & age) 
{ 
    age++; 
} 

它應該工作

2

您正在通過值傳遞age參數。這意味着它被複制到功能Update中並且該副本被修改。您需要通過引用來傳遞參數。這很容易在C++中完成,因爲它提供了引用類型。引用類型的名稱充當它綁定到的對象的別名。所有你需要做的就是添加一個號(&)你的類型:

void Man::Update(int& age) 
{ 
    age++; 
} 

當你做person.Update(age);你的對象age綁定到你的函數參考age

其他人可能會給你一個使用指針的替代方法(帶一個int*參數並將&age傳遞給該函數)。這是如何在C中完成的 - 但我們不寫C,不要讓他們欺騙你!採用引用類型比使用指針更安全,更有表現力。

但是,我問你爲什麼有一個類叫Manage不是Man的成員。類是將相關數據作爲對象存儲在一起的一種方法。我會認爲年齡是代表男性的數據的一部分。

+0

這只是一個例子 – joncodo

+0

這是一個反模式的例子。 –