2014-07-23 45 views
0
一個auto_ptr

您好我有一個編譯錯誤,當我運行此代碼:創建具有2個參數

std::auto_ptr<MyDisplay> m_display = 
    std::auto_ptr<MyDisplay>(new MyDisplay(this, m_displayController)); 

錯誤是這個:

error C2664: 'MyDisplay::MyDisplay(DemoWindow *,DisplayController*)': 
    cannot convert parameter 2 from 'std::auto_ptr<_Ty>' to 'DisplayController*' 

但是當我通過只有一個參數的代碼是正確的:

std::auto_ptr<DisplayController> m_displayController = 
    std::auto_ptr<DisplayController>(US_NEW(DisplayController, this)); 

什麼是與2個參數創建auto_ptr的指針的正確方法?

+0

什麼'MyDisplay'?正如@sharth所說,你爲什麼要使用'auto_ptr',因爲除非你有一個非常好的理由,否則! –

+2

請不要使用['std :: auto_ptr'](http://en.cppreference.com/w/cpp/memory/auto_ptr),它已被__deprecated__。你會讓自己無法結束心痛。請使用['std :: shared_ptr'](http://en.cppreference.com/w/cpp/memory/shared_ptr)或['std :: unique_ptr'](http://en.cppreference.com/w/cpp/memory/unique_ptr)。 –

+1

這段代碼是爲什麼'std :: auto_ptr'很糟糕:https://gist.github.com/sharth/637dfafbf579183f5d7b –

回答

3

從錯誤信息,看來m_displayControllerstd::auto_ptr<DisplayController>,而MyDisplay構造期望一個DisplayController*

嘗試:

std::auto_ptr<MyDisplay> m_display = 
    std::auto_ptr<MyDisplay>(new MyDisplay(this, m_displayController.get())); 

或更好,使構造與std::auto_ptr<DisplayController>兼容。

另外:在這裏選擇std::auto_ptr可能不是最好的。您可能想要在不同類型的智能指針上使用read up,以及它們具有的不同行爲。

+3

然後他通過值傳遞了一個'std :: auto_ptr',這意味着最初的'mDisplayController'然後指向null ...這就是爲什麼'std :: auto_ptr'是可怕的... –

+0

我怎麼沒有看到我需要一個DisplayController *,很明顯。感謝它做到了。我不明白爲什麼displayController在之後會爲空?我正在傳遞一個指針嗎? –

+0

@sharth除非,當然,這是他想要的。 (我在線程間隊列的接口中使用了'auto_ptr',它或多或少地保證了一次只有一個線程可以訪問這個對象。) –

0

我想澄清你的創建自動指針的想法,我希望這會有所幫助。
您的目標是創建一個擁有DisplayController *的auto_ptr。你可以寫

m_displayController = std::auto_ptr<DisplayController>(new DisplayController(x, y)); 

;或者返回一個指針的函數,就像這樣:

m_displayController = std::auto_ptr<DisplayController>(US_NEW(x,y)); 

您可以檢查出一個簡單的例子here.