2013-03-15 106 views
2

說我有這樣的對象:這是將指針指向對象的正確方法嗎?

class Game{ 
public: 
    void SetPointer(D2DResources&); 

public: 
    D2DResources* pD2DResources; 
}; 

使用此項功能:

void Game::SetPointer(D2DResources& p) 
{ 
    pD2DResources=&p; 
} 

而我呢,在我的WinMain:

Game game; 

D2DResources d2DResources(); 

game.SetPointer(d2DResources); 

可以嗎?如果沒有,那麼做什麼是正確的方法?這個想法是稍後訪問d2DResources的功能,如下所示:

pGame->pD2DResources->OnRender(); 

pGame是指向上述遊戲對象的指針。

+0

如果接收者保留指針的副本,我傾向於傳遞指針而不是引用,但這是一個慣例。但關鍵問題是所有權問題。誰將擁有D2DResources? – 2013-03-15 23:24:11

回答

1

只要指出的實例保持活着,我認爲你的方法沒有問題。但似乎你想在一個函數WinMain中聲明該實例,在這種情況下它將不起作用。

讓我們一個NIT流出第一的方式:下面一行

D2DResources d2DResources(); 

將宣佈它返回一個D2DResources和不帶任何參數,而不是D2DResources類型的變量的函數。如果你想後,刪除括號:

D2DResources d2DResources; 

現在,如果你想保持實例存活更長的時間,你應該使用std::shared_ptr。一個例子可能是這樣的:

class Game{ 
public: 
    void SetPointer(D2DResources&); 

public: 
    std::shared_ptr<D2DResources> pD2DResources; 
}; 

void Game::SetPointer(std::shared_ptr<D2DResources> p) 
{ 
    pD2DResources=p; 
} 

WinMain,使用方法:

Game game; 

auto d2DResources = std::make_shared<D2DResources>(); 

game.SetPointer(d2DResources); 

使用保持你想要的一樣。

相關問題