我不想在不需要的时候使用指针,但问题是:在下面的代码中,如果我删除星号并使level
只是object
,并且当然删除行level = new Level;
我收到运行时错误,原因是level
然后在第一行初始化,initD3D
和init_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
行声明一个名字;是否参数,你仍然需要在某个时候初始化它。
答案 0 :(得分:8)
如果您这样做,那是对的:
Level level;
然后level
将在那时实例化 。这是因为上面的表达似乎是全局的,不仅仅是声明,还有定义。
如果这导致问题,因为Level
在实例化其他内容之前被实例化,那么你遇到了全局性吮吸的经典原因。
您尝试通过使level
指针然后稍后“初始化”来解决此问题。你可能会感到惊讶的是,level
仍然在同一点被实例化。现在的区别是level
的类型。它不再是Level
了;现在是指向level
的指针。如果您在代码输入level
时检查Initialize
的值,则会看到它的值为NULL。
它的值为NULL而不是垃圾值,因为全局变量是静态初始化的,在这种情况下,这意味着零初始化。
但这与真正的问题有些相关,即你首先使用全局变量。如果需要按特定顺序实例化对象,请按顺序实例化它们。不要使用全局变量,你可能会发现通过这样做,你也不需要使用指针。
答案 1 :(得分:0)
这只是一个答案是使用指针
的情况
是的,基本上。