为什么我的C ++函数必须有不同的指针参数?

时间:2016-11-17 17:22:10

标签: c++ pointers function-declaration

我使用指针传递创建了一个C函数,只有当指针不同时才会给出正确的结果。例如:

void dotransform(Point *pout, const Point *pin, transform mat)
{
    pout->x = mat[0][0] * pin->x + mat[1][0] * pin->y + mat[2][0] * pin->z + mat[3][0] * 1.0;
    pout->y = mat[0][1] * pin->x + mat[1][1] * pin->y + mat[2][1] * pin->z + mat[3][1] * 1.0;
    pout->z = mat[0][2] * pin->x + mat[1][2] * pin->y + mat[2][2] * pin->z + mat[3][2] * 1.0;
}

dotransform()应该像这样调用:

//...
Transform toWorldMat;
Point local;
Point world;
dotransform(&world, &local, toWorldMat );

问题是,我团队中的某个人称之为:

Point p;
dotransform(&p, &p, toWorldMat);

我花了一周的时间才弄清楚为什么程序的最终输出发生了变化。

宣布这种功能的最佳方式是什么,以避免这种情况?我这样写错了吗?

1 个答案:

答案 0 :(得分:3)

看到你已经直接传递了transform对象(虽然不是const&:你真的应该这样做了)是否有任何理由你不能写代码像这样:

Point dotransform(Point const& pin, transform const& mat)
{
    Point pout
    pout.x = mat[0][0] * pin.x + mat[1][0] * pin.y + mat[2][0] * pin.z + mat[3][0] * 1.0;
    pout.y = mat[0][1] * pin.x + mat[1][1] * pin.y + mat[2][1] * pin.z + mat[3][1] * 1.0;
    pout.z = mat[0][2] * pin.x + mat[1][2] * pin.y + mat[2][2] * pin.z + mat[3][2] * 1.0;
    return pout;
}

然后,您可以编写如下代码:

Transform toWorldMat;
Point local;
Point world = dotransform(local, toWorldMat);

或者这个:

Point p;
p = dotransform(p, toWorldMat);

这些是编写此代码的正确,思想的C ++方法。