2014-12-01 56 views
-2

比方說,我創建了一個類對象,在類中使用某些私有變量和公共訪問器和mutator公共函數來訪問/更改這些變量。C++:如何在main之外訪問類對象的私有變量?

現在我們假設我在主函數內創建了一個類對象的實例,我們稱它爲A.在main()中,我調用在main()之外聲明的函數,我將它傳遞給A,實例是類對象。 我想要做的是,在這些外部函數中,使用已實現的公共mutator函數在main()之外更改實例A的現有私有變量中的值。使用我的代碼,我一直試圖要做到這一點,以讓我們說傳遞像這樣:

randomFunction(objectInstance); 

和main()的定義之外的隨機函數中,我試圖改變私有變量中的值,像這樣:

void randomFunction(classObject objectInstance){ 
... 
objectInstance.changeValue(657428391); 
... 
} 

但實際值沒有在main()中更新。 有沒有我可以用類對象實例做的一些指針魔術?

+3

請顯示驗證碼,不要形容。 – PaulMcKenzie 2014-12-01 21:20:14

+0

過了一段時間,因爲我做了任何C++,但不應該是objectInstance-> changeValue(12345); ? – Alan 2014-12-01 21:21:41

+1

@Alan,僅限於指針。 – chris 2014-12-01 21:22:21

回答

0

您按值傳遞對象。當您按值傳遞一個對象時,該函數正在處理該對象的臨時副本,而不是實際的對象本身。如果你這樣做,你在函數中所做的任何更改都不會反映給調用者。

通過引用而不是通過值傳遞對象:

void randomFunction(classObject& objectInstance) 
{ 
    objectInstance.changeValue(123456); 
} 

現在,您將看到值反射回給調用者,因爲你實際使用的是被傳遞的對象。

請注意,這是不不同比如果類型是一個intdouble等只是因爲它是一個對象不改變規則。例如:

#include <iostream> 
void someFunction(int x) 
{ 
    x = 10; 
} 

int main() 
{ 
    int a = 0; 
    someFunction(a); 
    std::cout << a; 
} 

您將看到的a值仍然爲0,即使一個函數被調用,改變傳入的變量10的原因又是,該功能someFunction需要它的參數通過值。將其更改爲一個參考,你會看到a更改爲10

2

按值傳遞的classObject,而不是引用,所以你可以將這個對象的副本,而不是修改你傳遞的一個。

因此,您對objectInstance所做的任何更改都是對象的本地副本,而不是傳入的對象。你不得不函數簽名改爲

void randomFunction(classObject& objectInstance) 

或者你可以使用一個指針

void randomFunction(classObject* objectInstance) 

然後調用功能

randomFunction(&objectInstance); 
0

我假設你的函數可以看起來像這個:

void DoSomeStuff(A instance); 

如果這是你的情況,你正在創建一個副本的新變量,所以事實上你改變了本地副本,而不是你的實際變量。

你可以聲明它像

void DoSomeStuff(A &instance); //reference to A 

void DoSomeStuff(A *instance); //pointer to A 

在這種情況下,你會真正改變你的變量傳遞到這些功能

1

至於我能理解你傳遞的是對象的值而不是引用。用途:

無效randomFunction(classObject & objectInstance){

這樣refernces將被複制,並且您在randomFunction所做的更改將被反射回的主要功能。