未能返回unique_ptr

时间:2016-11-05 22:36:36

标签: c++ smart-pointers unique-ptr

HPP:

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

看两条评论的行。该程序将编译它们是否被注释掉,但如果是,则数据将被破坏。

如何编写一个返回unique_ptr的getter,它是该类的私有成员?如何在构造函数中正确设置unique_ptr?

1 个答案:

答案 0 :(得分:4)

这是一个更好的主意:停止不必要地分配内存。让Camera直接存储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; }