构造函数完成运行时,指针变为null

时间:2011-09-30 12:01:56

标签: c++ pointers constructor

我有一个带有两个指针作为参数的相机类:

Camera::Camera(
    float fOVDeg, float nearCull, float farCull,
    float xPos, float yPos, float zPos,
    D3DMATRIX* matProjection, D3DMATRIX* matView)
{
    this->SetCamera(fOVDeg, nearCull, farCull);
    this->AdjustCamera(xPos, yPos, zPos);

    matProjection = &(this->projection);//gets the addresses of two private members
    matView = &(this->view);
}

这是调用它的代码:

D3DMATRIX* matProjection,* matView;

//called once
void Initialise(HWND hWnd)
{
    camera = new Camera(
            45.0f, 1.0f, 100.0f,
            0.0f, 9.0f, 24.0f,
            matProjection, matView);

...rest of code...

基本上问题是我希望代码中的两个指针调用相机构造函数来保留相机类的两个私有成员的内存地址,这样我就可以用它们来做事!麻烦的是,这很好用,但是一旦构造函数完成,指针就会变为空(0x00000000)。我不知道为什么!相机的私人成员仍然有价值观,因为我之前只是用吸气剂抓住他们的价值而且它运作良好。

3 个答案:

答案 0 :(得分:8)

您正在按值传递matProjection,因此,构造函数中的赋值会分配给本地副本(在外部不可见)。尝试使用参考:

Camera::Camera(
    float fOVDeg, float nearCull, float farCull,
    float xPos, float yPos, float zPos,
    D3DMATRIX* &matProjection, D3DMATRIX* &matView)
---------------^        ------------------^

其余代码应该保持不变。

回应您的意见:

  

还有一点我不太明白为什么我不必放置'&'在调用前面的matProjection和matView

因为当函数参数被声明为引用时,编译器会将其指出并传递引用(可能实现为指针)。

  我正确地认为你传递了它指向的值..因此你需要引用的是获取实际指针的地址吗?

是。指针与int s没有区别,在正常情况下,它们的值会被传递。当您需要函数来设置变量(指针类型,但同样适用于int s)时,您必须传递一个指针指针或一个类似的引用指针,但后者带有整洁的语法糖。

答案 1 :(得分:3)

您正在按值传递指针。所以Camera构造函数正在为这些指针的副本赋值。你需要通过引用传递指针...

Camera::Camera(
    float fOVDeg, float nearCull, float farCull,
    float xPos, float yPos, float zPos,
    D3DMATRIX*& matProjection, D3DMATRIX*& matView)

答案 2 :(得分:1)

查看今天的另一个问题:Why is my pointer not null after free?

您需要引用类型参数或指针指针。按值参数不会完成任务。