2013-03-15 2 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? –

ответ

1

До тех пор, пока заостренный объект остается в живых, я не вижу проблем с вашим подходом. Но, похоже, вы хотите объявить экземпляр в функции WinMain, и в этом случае он не будет работать.

Давайте проясним одну нита из пути первого: Следующая строка

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); 

использования остается таким же, как вы хотели.

Смежные вопросы