【问题标题】:Is this the correct way to assign a pointer to an object into a function?这是将指向对象的指针分配给函数的正确方法吗?
【发布时间】:2013-03-15 22:37:10
【问题描述】:

说我有这个对象:

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 是指向上述游戏对象的指针。

【问题讨论】:

  • 如果接收者保留指针的副本,我倾向于传递指针而不是引用,但这是一个约定问题。但关键问题是所有权问题。谁将拥有 D2DResources?

标签: c++ oop pointers


【解决方案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);

用法保持不变。

【讨论】:

    猜你喜欢
    • 2013-01-16
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2011-04-02
    相关资源
    最近更新 更多