2016-11-17 2 views
0

포인터가 다른 경우에만 올바른 결과를 제공하는 포인터 전달을 사용하여 C 함수를 만들었습니다. 예를 들어 : C++ 함수가 다른 포인터 인수를 사용해야하는 이유는 무엇입니까?

dotransform()

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; 
} 
는 다음과 같이 호출 할 예정이다 : 그것은 단지 나를 데려

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

:

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

, 우리 팀의 누군가가 이런 식으로 호출 프로그램의 최종 출력이 왜 바뀌 었는지 알아보기 위해 1 주.

이 경우를 피하기 위해 이런 종류의 기능을 선언하는 가장 좋은 스타일은 무엇입니까? 나는 그것을 그렇게 쓰는 것이 잘못 되었습니까? 이미 직접 transform 객체를 전달하는 것처럼

+4

하나의'Point' 매개 변수'pin' 만 보내고 그렇지 않으면 쓸모없는 함수 반환 값을 출력 결과로 사용하십시오. – WhozCraig

+0

아마도 C++을 사용하고있을 것입니다.이 같은 간단한 예제에서는 포인터로 객체를 전달하지 마십시오. 참조로 전달하십시오. – Xirema

답변

3

보고 (안 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++ 방법입니다.

관련 문제