C ++指针用于持久对象

时间:2012-10-10 11:28:36

标签: c++ pointers

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

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

玩家的库存基本上只是一个包含项目对象的向量(我创建的'Item'类)。

如果有人能够澄清以下内容,那么我就会清除我的困惑:

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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

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