2012-11-04 3 views
0

프로젝트의 C++에서 리플렉션 양식을 구현하려고합니다. 아이디어는 태그로 클래스를 일종의 템플릿으로지도에 등록한 다음 공유 기본 클래스의 cloneNew 메소드를 호출하여 실제로 원하는 객체를 만드는 것입니다. 그러나이 기능을 구현하기 위해 va_list를 사용하려고하면 이상한 결과가납니다. 문제 코드는 다음과 같습니다.홀수 값을 반환하는 C++ va_list

GameObject* SphereObstacle::cloneNew(const Vector& position, double charge, const Vector&   dipole, ...) 
{ 
    va_list v1; 
    va_start(v1, dipole); 
    double radius = va_arg(v1, double); 
    va_end(v1); 
    return new SphereObstacle(position, charge, dipole, radius); 
} 

va_list에서 읽으려고 할 때마다 거대한 값을 반환합니다. 거의 포인터처럼 보입니다. 내 생각에이 문제는 기본 클래스에 가상 메서드가 구현되어 있기 때문에 발생하지만 실제로 온라인에서 문제가 있음을 알지 못했습니다. 내가 잘못하고있는 것은 무엇인가?

답변

4

문제는 dipole이 참조 유형입니다. [support.runtime]/3 인용 va_start 관하여 :

파라미터 parmN 함수 정의의 가변 파라미터리스트에서 우측 파라미터 의 식별자 (바로 전에 하나 ...). 매개 변수 parmN이 함수, 배열 또는 참조 형식으로 선언되었거나 매개 변수가없는 인수를 전달할 때 발생하는 형식과 호환되지 않는 형식을 사용하는 경우 동작은 정의되지 않습니다.

+0

확인 아, 그래서 충전 인수를 넣어 마지막으로 문제를 해결해야합니까? 줄임표 내에서 추가 참조 인수를 전달할 수 있습니까, 아니면 그 문제입니까? – Pat

0

변경 선언 같은 ...

게임 오브젝트 * SphereObstacle :: cloneNew (const를 벡터 & 위치, 이중 청구, 벡터 다이폴 안테나, ...)