C ++ va_list返回奇数值

时间:2012-11-04 22:14:57

标签: c++

我正在尝试在C ++中为项目实现一种反射形式。您的想法是将带有标记的类注册到地图中作为一种模板,然后调用共享基类的cloneNew方法来实际创建所需的对象。但是,当我尝试使用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读取时,它都会返回一个巨大的值。它几乎看起来像一个指针。我唯一的想法是问题是由于这是基类中虚拟方法的实现这一事实,但我没有在网上发现任何暗示这就是问题。我做错了什么?

2 个答案:

答案 0 :(得分:4)

问题在于dipole是引用类型。关于va_start,引用[support.runtime] / 3:

  

参数parmN是最右边参数的标识符   在函数定义的变量参数列表中(恰好在......之前)。如果是参数   parmN使用函数,数组或引用类型声明,或者使用与...不兼容的类型声明   在传递没有参数的参数时产生的类型,行为是未定义的。

答案 1 :(得分:0)

将声明更改为......

GameObject * SphereObstacle :: cloneNew(const Vector& position,double charge,Vector dipole,...)