【问题标题】:C++ pointer use for persistent objects用于持久对象的 C++ 指针
【发布时间】:2012-10-10 11:28:36
【问题描述】:

我正在使用 C++ 开发游戏。我在很多地方读到过,基本上应该不惜一切代价避免在 C++ 中使用指针。我还在学习 C++,对此有点困惑。

我想要一个持久的玩家对象,并在游戏会话期间存在。该对象将包含玩家库存、玩家统计数据等。

玩家的物品栏基本上只是一个包含物品对象的向量(我创建的“物品”类)。

如果有人可以澄清以下内容,它将消除我的困惑:

  1. 当人们说“指针不好”时,他们指的是标准 C++ 指针吗?智能指针是否被视为“正常”?
  2. 除了指针之外,我还能如何访问分配在堆上的持久对象?
  3. 如果我想要一种在玩家库存中找到物品的方法,但如果找不到该物品则返回 NULL,那么如果没有指针,那如何实现呢?由于从“findItem”返回的项目应该是可编辑的(例如更改项目计数),目前我返回一个指向向量中项目的指针。这是对指针的有效使用吗?

任何帮助将不胜感激!

【问题讨论】:

  • 您所阅读的内容可能应该是“应不惜一切代价避免使用资源拥有原始指针”。而是。
  • 对不起,我还在学习C++,这到底是什么意思?
  • @LuchianGrigore:不,它是一个拥有资源的智能指针。

标签: c++ pointers


【解决方案1】:
  1. 是的,raw,C 风格的指针被认为是坏的。智能指针没问题。在某些情况下,您需要使用(智能)指针 - 多态对象的集合,例如:std::vector<std::unique_ptr<IObject> >

  2. 持久对象不必在堆上。它可以是一个具有静态存储持续时间的对象,甚至可以是一个存在足够长的自动对象 - 即您在 main() 中创建它。

  3. 多种方式 - 您可以抛出异常(可能过于苛刻)或采用 std 方式返回迭代器 - 类似于 .end()

【讨论】:

  • 好的,我现在明白了一点。您的第 2 点:您的意思是说创建对象并且不让它超出范围? IE。根据需要传递对象?
  • @ThisDarkTao 这就是我的意思(但这只是一个例子,它可能并不适用于你的特定情况)
  • 嗯,我明白了。我也没有意识到你可以返回一个迭代器。我将使用该解决方案来解决该问题!谢谢。
【解决方案2】:

我个人建议使用共享指针(来自 boost 或 std)。不要使用原始指针。 C++ 还有其他智能指针,比如 auto_ptr,但现在几乎没有人使用它们。 如果您想在堆上分配一些东西,请执行以下操作:

std::shared_ptr<ClassA> A(new ClassA());

这比使用原始指针更安全。当您超出范围时,共享指针将向您保证它指向的对象将被销毁。原始指针不这样做,这意味着您必须自己手动销毁所有内容

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多