2013-01-16 44 views
0

我很抱歉問這樣一個新手問題。 這裏是我的問題:C++方法參數類參考

MyClass* c = new MyClass("test"); 
method(c);//error cannot convert MyClass* to MyClass 

的定義:

method(MyClass c); 

是否也應該界定?

method(MyClass* c); 

我不想複製代碼,什麼是正確的方法?

+0

你想完成什麼?如果你擔心內存,根據你需要的方法嘗試'method(MyClass&c)'或'method(const MyClass&c)'。 – RageD

+0

這取決於你想要做什麼。 –

+2

你的意思是'MyClass * c = new MyClass(「test」);'? –

回答

2

你很明顯是一個Java程序員!首先,你需要做的事:

MyClass* c = new MyClass("test"); 

注意c是一個「指針MyClass」 - 這是必要的,因爲new表達給你的指針動態分配的對象。

現在,要將此函數傳遞給需要參數MyClass的函數,您需要取消引用指針。也就是說,你會做什麼:

method(*c); 

注意,因爲該函數採用MyClass按值(不是引用),對象將被複制到你的函數。 method中的MyClass對象將是您之前分配的對象的副本。參數的類型取決於你想要你的功能做什麼和傳達什麼。如果您想要對該對象進行引用,以便修改該函數內部的對象將修改函數外的對象,則需要使用函數MyClass&參數 - 對MyClass的引用。

如果你有說法是MyClass*型的,那麼你可以簡單地做:

method(c); 

這會給你類似的語義傳遞一個參考,因爲指針c將被複制到函數但是指針所指的對象仍然是動態分配的對象MyClass。也就是說,如果在修改*d的函數內部,c指向的對象也會被修改。

像這樣傳遞一個原始指針通常不是一個很好的方法。該函數必須明確檢查指針是否爲空,否則在某些情況下程序可能會崩潰。如果你想通過引用的語義,使用引用類型 - 這是他們的目的。

但是,最好不要動態分配您的MyClass對象。我想你只使用new,因爲你在Java中做了很多。在C++中,new表達式用於動態分配的一個對象。通常情況下,您不想動態分配對象。這是完全沒有用自動存儲時間,你會做像這樣創建:

MyClass c("test"); 
method(c); 

它被認爲是在C++中,以避免指針和動態分配的,除非你有一個很好的理由非常好的做法。它只會導致更復雜的代碼,更多的空間出現錯誤和錯誤。事實上,您提供的代碼已經存在問題,因爲您沒有delete c;。當你按照我的建議去做時,你不需要明確地刪除任何東西,因爲對象在超出範圍時會被銷燬。

1
MyClass *c = new MyClass("test"); 

method(*c); 

它的工作原理,如果你定義的方法類似method(MyClass c)

但是,如果您定義的方法一樣method(MyClass *c);

那麼它應該是

MyClass *c = new MyClass("test"); 
method(c); 

的兩個備選方案都取決於後果你想要用你創建的對象做什麼。

+0

這將導致c的* COPY *被傳入方法。你確定這是正確的做法嗎?這只是一個不好的建議。如果有人問你「我怎麼把這個方形釘放進圓孔裏」,答案不是「用錘子」。答案是「你想要做什麼?」所以在這裏你應該要求OP解釋他實際上想要完成的事情。 –

+0

我同意,但我剛剛下了投票同樣的迴應...... :( –