奇怪的行为合并2个类函数并通过引用传递变量

时间:2011-04-13 00:27:43

标签: c++ class function pass-by-reference

我有以下两个类函数,我试图合并为一个,因为它们非常相似:

void Camera::UpdateCameraPosition(void) {
    if(cameraMode == CAMERA_MODE_THIRD_PERSON) {
        float alpha = Math::DegreesToRadians(Rotation.y);
        float beta = Math::DegreesToRadians(Rotation.x);

        Position.SetValue(
            Player.x + CAMERA_ORBIT_OFFSET * cos(beta) * sin(alpha),
            Player.y + CAMERA_ORBIT_OFFSET * sin(-beta),
            Player.z + CAMERA_ORBIT_OFFSET * cos(beta) * cos(alpha)
        );
    } else {
        Position = Player;
    }
}

void Camera::UpdatePlayerPosition(void) {
    if(cameraMode == CAMERA_MODE_THIRD_PERSON) {
        float alpha = Math::DegreesToRadians(Rotation.y);
        float beta = Math::DegreesToRadians(Rotation.x);

        Player.SetValue(
            Position.x - CAMERA_ORBIT_OFFSET * cos(beta) * sin(alpha),
            Position.y - CAMERA_ORBIT_OFFSET * sin(-beta),
            Position.z - CAMERA_ORBIT_OFFSET * cos(beta) * cos(alpha)
        );
    } else {
        Player = Position;
    }
}

如您所见,PlayerPosition是该类的两个私有变量。它们的数据类型为Vector3D,另一类。

我试图像这样合并它们:

void Camera::UpdateCameraOrPlayerPosition(Vector3D &target, Vector3D reference) {
    if(cameraMode == CAMERA_MODE_THIRD_PERSON) {
        float alpha = Math::DegreesToRadians(Rotation.y);
        float beta = Math::DegreesToRadians(Rotation.x);

        target.SetValue(
            reference.x - CAMERA_ORBIT_OFFSET * cos(beta) * sin(alpha),
            reference.y - CAMERA_ORBIT_OFFSET * sin(-beta),
            reference.z - CAMERA_ORBIT_OFFSET * cos(beta) * cos(alpha)
        );
    } else {
        target = reference;
    }
}

这编译等但它的行为不一样。虽然其他两个函数正在工作,但当我将这些函数调用替换为此函数时,它不能正常工作。

我做的替换是:

UpdatePlayerPosition() -> UpdateCameraOrPlayerPosition(Player, Position)
UpdateCameraPosition() -> UpdateCameraOrPlayerPosition(Position, Player)

我也尝试用指针代替引用,结果是一样的。我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:0)

你会注意到target.SetValue在调整X Y和Z坐标时使用+代表Camera和 - for Player。