2017-04-15 185 views
-1

(我沒有找到我一直在尋找的答案,但我弄明白我自己,所以我想嘗試回答我的問題別人誰可能在將來)傳遞對象

如何將對象傳遞給非類函數並更改其數據? 例如

類Foo {}具有私人INT X = 5,我想它與出從類直接入射ChangeValue函數改變爲10,但使用非類函數調用此函數。

回答

0

所以,如果你的代碼看起來是這樣的:

class Foo { 
public: 
    void changeValue(int val) { x = val; } 
private: 
    int x; 
} 

而且要改變X給ChangeValue方法外,所有你需要做的就是添加功能要在更改爲朋友Foo課。因此,例如,對於這個工作:

void g(Foo& foo) { 
    foo.x = 10; 
} 

您必須將此行添加到您的Foo類:

friend void g(Foo& foo); 

聲明類爲好友裏面的東西讓該函數/類訪問私有成員和方法。

+0

我張貼的答案,原來,這對我有用,我不知道它是否正確,你能檢查它嗎? – Christina

+0

看完你的解決方案後,我看不出如何工作。如果我是對的,在創建test2時在changeVal函數內部,它是通過複製創建的,所以test2.change(num)不會改變測試內的任何東西。 –

+0

當你聲明某事是私人的時候,它不應該在你認爲可以訪問的方式之外訪問(f.e.將外部函數聲明爲朋友)。 –

-1

比方說,我們有

class Foo{ 
private: 
    int x; 
public: 
    change(int y){ 
     x = y; 
    } 
} 

,我們想要的功能

void changeVal(Foo test, int num); 

改變,而不是

Foo::change(int y); 

的X,我們將給予我們的changeVal函數的地址對象

int main(){ 
    Foo test; 
    changeVal(&test, 5); 
} 

那麼我們要創建changeVal,使指針對象來保存我們的原始對象

void changeVal(Foo* test, int num){ 
    ... 
} 

的地址,並在身體,我們需要創建第三個目的在於把原來對象的值所以我們給它,我們存儲在「富*測試」的地址與原地址更改新對象的值,所以我們正在改變,而不是一個副本

void changeVal(Foo* test, int num){ 
    Foo test2 = &test; 
    test2.change(num); 
} 
+0

這似乎更多的是對問題的澄清,而不是一個完整的答案。但是,你問的問題還不是很清楚。也許, 刪除這個問題,收集一切到一個新的(與工作代碼),並突出你不確定的部分。 – Potatoswatter