указатель становится нулевым, когда конструктор завершает работу - PullRequest
0 голосов
/ 30 сентября 2011

У меня есть класс камеры, который имеет два указателя в качестве параметров:

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 ]

8 голосов
/ 30 сентября 2011

Вы передаете matProjection по значению, поэтому присвоения ему в конструкторе присваивают локальной копии (которая не видна снаружи). Попробуйте использовать ссылку:

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

Остальной код должен остаться прежним.

Ответов на ваши комментарии:

еще одна вещь, которую я не совсем понимаю, это то, почему мне не нужно помещать '&' перед matProjection и matView в вызове

Поскольку, когда параметр функции объявлен как ссылка, компилятор вычисляет это и передает ссылку (вероятно, реализованную в виде указателя).

Правильно ли я считаю, что вы передаете значение, на которое он указывает ... поэтому вам нужно сослаться на это, чтобы получить адрес фактического указателя?

Да. Указатели ничем не отличаются от int с, и при нормальных условиях их значение передается. Когда вам нужна функция для установки вашей переменной (типа указателя, но то же самое относится к int s), вы должны либо передать указатель на указатель или ссылку на указатель, которые похожи, но последний поставляется с аккуратным синтаксическим сахаром.

3 голосов
/ 30 сентября 2011

Вы передаете указатели по значению. Поэтому конструктор Camera присваивает значения копиям этих указателей. Вам нужно передать указатели по ссылке ...

Camera::Camera(
    float fOVDeg, float nearCull, float farCull,
    float xPos, float yPos, float zPos,
    D3DMATRIX*& matProjection, D3DMATRIX*& matView)
1 голос
/ 30 сентября 2011

Смотрите другой сегодняшний вопрос: Почему мой указатель не равен нулю после освобождения?

Вам нужен аргумент ссылочного типа или указатель на указатель.Аргументы по значению не будут выполнять вашу задачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...