2016-11-05 3 views
0

HPP zurückzukehren Failing:eine 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); 
} 

Blick auf die beiden kommentierten Zeilen. Das Programm wird kompilieren, ob sie auskommentiert sind oder nicht, aber wenn dies der Fall ist, werden die Daten beschädigt.

Wie kann ich einen Getter schreiben, der ein unique_ptr zurückgibt, das ein privates Mitglied der Klasse ist? Wie setze ich unique_ptr im Konstruktor richtig?

+1

Warum wollen Sie return a 'unique_ptr' wofür wird es verwendet? – Galik

+0

Was machst du mit dieser Projektionsmatrix? Es scheint mir, als wären Sie in Ordnung, wenn Sie einen Observer-Zeiger zurückgeben, anstatt ihn in den Nur-Zuweisungs-Status zu überführen. – krzaq

+0

Der Observer-Zeiger ist ebenfalls in Ordnung. Ich muss die Matrix an den Renderer übergeben, damit sie in einen Shader geladen werden kann. – Karlovsky120

Antwort

4

Hier ist eine viel bessere Idee: Stoppen Sie unnötige Speicherzuweisung. Habe Camera eine glm::mat4x4 direkt speichern, nicht als unique_ptr. C++ ist nicht Java; Sie müssen nicht alles mit new zuweisen. Alle Code wird viel einfacher:

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

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

Wenn Sie jedoch unbedingt verwenden müssen, um eine unique_ptr in Camera, dann sollten Sie einen Verweis zurückgeben, nicht ein intelligenter Zeiger:

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

Vereinfacht meinen Code sehr. Vielen Dank. – Karlovsky120