没有构造函数的类强制使用指针类型?

时间:2011-10-13 15:17:10

标签: c++

我不想在不需要的时候使用指针,但问题是:在下面的代码中,如果我删除星号并使level只是object,并且当然删除行level = new Level;我收到运行时错误,原因是level然后在第一行初始化,initD3Dinit_pipeline之前 - 设置的方法投影和使用视图。你看到问题是level使用了这两件事,但是当我第一次完成时,我得到一个null指针异常。

这只是一个答案是使用指针的情况吗?我之前遇到过这个问题,基本上看起来非常令人烦恼的是,当一个类类型不接受任何参数时,你基本上是在你声明它的地方初始化它......或者我对这个最后一部分是错误的吗?

Level* level;

D3DMATRIX* matProjection,* matView;

//called once
void Initialise(HWND hWnd)
{
initD3D(hWnd);
    init_pipeline();

level = new Level;
}

我来自c#,在c#中,你只需要用Level level行声明一个名字;是否参数,你仍然需要在某个时候初始化它。

2 个答案:

答案 0 :(得分:8)

如果您这样做,那是对的:

Level level;

然后level将在那时实例化 。这是因为上面的表达似乎是全局的,不仅仅是声明,还有定义

如果这导致问题,因为Level在实例化其他内容之前被实例化,那么你遇到了全局性吮吸的经典原因。

您尝试通过使level指针然后稍后“初始化”来解决此问题。你可能会感到惊讶的是,level仍然在同一点被实例化。现在的区别是level类型。它不再是Level了;现在是指向level的指针。如果您在代码输入level时检查Initialize的值,则会看到它的值为NULL。

它的值为NULL而不是垃圾值,因为全局变量是静态初始化的,在这种情况下,这意味着零初始化。

但这与真正的问题有些相关,即你首先使用全局变量。如果需要按特定顺序实例化对象,请按顺序实例化它们。不要使用全局变量,你可能会发现通过这样做,你也不需要使用指针。

答案 1 :(得分:0)

  

这只是一个答案是使用指针

的情况

是的,基本上。