2012-12-25 166 views
0

我正在构建一个简单的通用引擎,用于制作游戏的真正开始,并且我试图以某种方式在制作引擎时进行组织化和体面的设计,这意味着我不希望它成为我投掷的东西一旦我做出我打算做的事情。不初始化指针并将其初始化为null会有什么区别?

我添加了要显示的对象,drawObject s,这些可以移动,不移动,并有一个动画,或没有一个。

如果他们有一个动画,我想初始化一个animationSet,而这个animationSet将有xxx animationComp在里面。由于我试图保持整洁,并对内存和CPU使用进行了“优化”(例如共享已经加载的映像指针,以及我脑子里想到的任何内容),所以我不想在数组中寻求可能未使用的内存。

所以我最初有animationSetS* animationSet = NULL;,打算做一个animationSet = animationSetS[spacesINEED];之后,只在需要动画的对象上添加,那些动画不是动画NULL,因此没有使用内存(正确?)。 然后这个问题弹出! (标题)

struct animationComp { 
     SDL_Rect* clip; 
     int clipsize; 
    }; 

    struct animationSetS { 
     animationComp* animation; 
     int currentFrame; 
     int currentAnimation; 
     int animationNumber; 
    }; 

    struct drawObject { // Um objecto. 
     char* name; 
     SDL_Surface* surface; 
     bool draw = true; 
     float xPos; 
     float yPos; 
     bool willMove = false; // 0 - Won't move, 10 - Moves alot, TO IMPLEMENT 
     bool isSprite = false; 
     animationSetS* animationSet; 
    }; 

我涉足了很多问题,对不起。对于这里的任何澄清答复,我会在10分钟内回复下一个... 1小时?或者更多。 谢谢!

+1

您的标题问题和示例不匹配。 'animationSet'是一个**指针**,不是数组。 –

+0

对不起,我的坏! – GigaBass

+2

你应该更喜欢使用RAII成语(http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization) –

回答

3

将指针设置为NULL意味着您可以添加ASSERT(ptr != NULL);并知道您的指针不会意外地包含它正在使用的内存中发生的任何垃圾值。

因此,如果由于某种原因,您最终在正确设置之前使用该对象,您可以检测到它。

这也有助于如果你有时不使用某个字段,你仍然可以调用delete stuff; [假设它是首先分配的]。

请注意,保留变量未初始化意味着它可以具有任何值在其有效范围内[对于某些类型,在有效范围之外 - 例如指针和浮点值可以是“处理器不允许的值”]。这意味着在代码中“告诉”它是否已经被初始化是不可能的 - 但是如果你不初始化事情,事情会变得非常糟糕!

+0

那么让它= NULL或刚声明基本相同?谢谢! – GigaBass

+2

@ user1896797他没有这么说! –

+0

除了他所说的,我的意思是相同的。 – GigaBass

3

如果这应该在C++中真正实现(如您所写),为什么不使用C++标准库?像

struct animationSetS { 
    std::vector< std::shared_ptr<animationComp> > animation; 
    // ... 
} 
+1

我同意,这是一个更好的解决方案! –

+0

由于我没有经验与C++,我试图从地上爬起来,而不结构图书馆做这一切只是为了习惯使用指针和所有的。这是一件坏事吗? – GigaBass

+0

@ user1896797:这是不是一件坏事 - 但为什么要重新实现所有的东西这是已经在那里? –