2012-07-09 81 views
0

我有在C++中實例化對象一個簡單的問題: 如果我們假設我班有一個默認的構造函數,然後創建新的對象這樣的:錯誤,而一個類實例化

PfAlgorithm object = new PfAlgorithm(); 

但是當我跑我得到這個錯誤:

conversion from ‘PfAlgorithm*’ to non-scalar type ‘ns3::PfAlgorithm’ requested 

有人可以向我解釋這個錯誤的原因嗎? 非常感謝。

回答

5

new運算符返回一個指針,而不是一個值。所以,你需要寫:

PfAlgorithm* object = new PfAlgorithm() 

object是一個指向新分配的PfAlgorithm對象。關於指針的一些簡單的介紹性信息可以參見here。然而,正如在下面的評論中所討論的那樣,處理原始指針(由於內存泄漏的潛在問題,不明確的所有權等問題)幾乎不是一個好主意。繼續閱讀...

在堆中分配此對象後,您需要確保在完成時刪除它,否則應用程序將泄漏內存。爲了簡化操作,我強烈建議您考慮使用來自boost libraries(或C++ 11)的智能指針來管理您的內存。

另外,各種其他人所說,你可以簡單地做:

PfAlgorithm object; 

而棧上分配的對象,而不必擔心如何管理內存。

+0

這樣做比所需的更復雜。丟失指針(因此是'new')。鑑於OP提供的詳細程度,這只是**不是**可接受的解決方案。 – 2012-07-09 20:20:37

+0

@KonradRudolph。好。我很欣賞指針是複雜的。但是,坦率地說,你不會對C++有太多瞭解,而不瞭解它們。所以我認爲另外包含一個堆棧分配(正如其他人所做的那樣,正如我已經包括的那樣)是完全有效的,但是斷言這不是一個可接受的解決方案,而是非常極端。 – 2012-07-09 20:26:05

+0

感謝您的回覆。 – user1499125 2012-07-09 20:28:21

5

你有可能在Java中比在C++中更有經驗嗎?

PfAlgorithm object; 

創建PfAlgorithm型蠻好的對象:與Java,C++中,你不要當你實例化一個對象需要new。當變量超出範圍時,該對象會自動銷燬。

1

C++區分一個對象(在你的情況下是PfAlgorithm類型)和一個指向對象的指針(PfAlgorithm *)。 new PfAlgorithm()表達式返回一個指向新分配的對象的指針。如果這是你想要的,你還必須讓object有一個指針的類型:

PfAlgorithm *object = new PfAlgorithm(); 

如果你不希望使用指針,擺脫new的:

PfAlgorithm object = PfAlgorithm(); 

在第一種情況下,一旦你不再使用它,你將不得不使用delete;在第二種情況下,該對象將在退出創建它的塊({...})時被銷燬。沒有Java或C#中的自動內存管理。