2016-11-05 3 views
0

ГЭС:В противном случае вернуть unique_ptr

class Camera { 
public: 
    Camera(float FOV, float nearPlane, float farPlane); 

    std::unique_ptr<glm::mat4x4> getProjectionMatrix(); 

private: 
    std::unique_ptr<glm::mat4x4> projectionMatrix; 
}; 

CPP:

Camera::Camera(float FOV, float nearPlane, float farPlane) { 

    float aspectRatio = DisplayManager::displayWidth/DisplayManager::displayHeight; 

    projectionMatrix = std::make_unique<glm::mat4x4>(); 
    *projectionMatrix = glm::perspective(FOV, aspectRatio, nearPlane, farPlane); 
} 

std::unique_ptr<glm::mat4x4> Camera::getProjectionMatrix() { 
    //std::unique_ptr<glm::mat4x4> projectionMatrix = std::make_unique<glm::mat4x4>(); 
    //*projectionMatrix = glm::perspective(90.0f, 1.333f, 0.1f, 1000.0f); 
    return std::move(projectionMatrix); 
} 

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

Как я могу написать getter, который возвращает unique_ptr, который является частным членом класса? Как правильно установить unique_ptr в конструкторе?

+1

Почему вы хотите верните 'unique_ptr', для чего он будет использоваться? – Galik

+0

Что вы делаете с этой матрицей проекций? Мне кажется, что вам будет хорошо с возвратом указателя наблюдателя вместо того, чтобы превращать его в состояние только для назначения. – krzaq

+0

Указатель наблюдателя тоже прекрасен. Мне нужно передать матрицу в средство визуализации, чтобы оно могло загрузить его в шейдер. – Karlovsky120

ответ

4

Вот еще лучшая идея: остановить ненужное выделение памяти. Имейте Camera магазин a glm::mat4x4 напрямую, а не как unique_ptr. C++ - это не Java; вам не нужно выделять все с помощью new. Весь ваш код становится намного проще:

Camera::Camera(float FOV, float nearPlane, float farPlane) 
    : projectionMatrix(glm::perspective(FOV, (DisplayManager::displayWidth/DisplayManager::displayHeight), nearPlane, farPlane)) 
{ 
} 

glm::mat4x4 &Camera::getProjectionMatrix() { return projectionMatrix; } 

Однако, если вы абсолютно необходимо использовать unique_ptr в Camera, то вы должны вернуть ссылку, не умный указатель:

glm::mat4x4 &Camera::getProjectionMatrix() { return *projectionMatrix; } 
+0

Упрощенный мой код много. Благодарю. – Karlovsky120