2016-11-05 7 views
0

HPP返すために失敗: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:2つのコメント行で

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); 
} 

ルック。プログラムはコメントアウトされているかどうかにかかわらずコンパイルされますが、そうであれば、データが破損します。

クラスのプライベートメンバーであるunique_ptrを返すゲッターを作成するにはどうすればよいですか? unique_ptrをコンストラクタで正しく設定するにはどうすればよいですか?

+1

なぜあなたはしたいですか'unique_ptr'を何に使うのでしょうか? – Galik

+0

その投影行列で何をやっていますか?オブザーバーポインターを代入するのではなく、オブザーバーポインターを返すことでうまくいくようです。 – krzaq

+0

オブザーバーポインターも問題ありません。レンダラーに行列を渡してシェーダーにロードできるようにする必要があります。 – Karlovsky120

答えて

4

これははるかに良いアイデアです。メモリを不必要に割り当てるのをやめてください。 Cameraglm::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_ptrCameraでを使用する必要がある場合は、あなたが参照を返すべきではなく、スマートポインタ:

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

私のコードを単純化しました。ありがとう。 – Karlovsky120