对象或const指针的副本?

时间:2013-12-21 04:06:27

标签: c++ class pointers game-engine

我已经制作了一个2D游戏引擎,但我在质疑我做事的一种方式是否是结构上做事的最佳方式。例如,Sprite的成员可以有多个Graphic成员。现在我将这些成员保留在vector<const Graphic*>(不是std::vector,但为了简单起见,我会在示例中使用它):

class Sprite {
private:
    std::vector<const Graphic*> _graphicList;
public:
    Sprite();
    ~Sprite();
    void addGraphic(const Graphic* toAdd); //adds a const Graphic* to _graphicList
    void draw() const; //draws all items in _graphicList
};

以上示例运行正常。问题是,我需要将我的Graphic对象保留在此范围内才能工作。这会产生错误:

void foo (bool redCircle) {
    Sprite sprCircle;
    if(redCircle) {
        Graphic gfxRedCircle("redCircle.bmp");
        sprCircle.addGraphic(&gfxRedCircle);
    }
    else {
        Graphic gfxBlueCircle("blueCircle.bmp");
        sprCircle.addGraphic(&gfxBlueCircle);
    }
    sprCircle.draw(); //would possibly not work, since the Graphic is out of scope
}

我可以创建副本:

class Sprite {
private:
    std::vector<Graphic> _graphicList;
public:
    Sprite();
    ~Sprite();
    void addGraphic(Graphic& toAdd); //adds a Graphic to _graphicList
    void draw() const; //draws all items in _graphicList
};

然而,如果我将Graphic保留在范围内,这将浪费宝贵的记忆。

所以我想我的问题可以归结为:
在游戏引擎中,更重要的是:健壮性还是有效的内存使用?

2 个答案:

答案 0 :(得分:1)

如果你的对象超出范围,任何通过指针或引用使用它的尝试都有C ++语言标准的未定义行为(意思是,它可能会破坏其他一些对象,或者它可能会使程序崩溃,或者杀死你的猫最令人毛骨悚然的方式)。因此,如果该对象应在范围内 - 必须,这不是一个问题!

同样,稳健性是您不想为任何事情进行交易的品质。如果您的程序崩溃,用户将不关心它使用的内存有多少。要优化内存使用的程序,你应该仔细考虑很多因素 - 你的程序使用大多数内存,如何降低这种使用,以及你可以提取哪些技巧以使你的内存占用降低(例如通过缓存和大量重用现有对象)。这些因素中的每一个都严重依赖于您的特定程序,因此一般来说讨论它对您的特定目的几乎没有用。

答案 1 :(得分:0)

正确性应该是首要考虑因素。使用超出范围对象肯定是错误的,您的程序可以中止/挂起(未定义的行为)。

有一些方法,取决于你需要什么:

  • 复制对象
  

void addGraphic(const Graphic &toAdd);

这可能意味着如果Graphic对象包含指针并且您想要完美克隆它(不仅仅是指同一个内存),则需要实现深层复制/复制构造函数操作。如果你没有做深刻的复制,原始对象可能会被释放,你仍然会引用释放的内存。

  • 自己创建对象
void addGraphic(const string &bmpName);

只需在addGraphic中自己创建Graphic对象然后放入向量中,这样你就拥有了对象,它不会超出范围。

相关问题