2013-03-15 144 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); 

使用保持你想要的一样。

相关问题