我正在尝试在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读取时,它都会返回一个巨大的值。它几乎看起来像一个指针。我唯一的想法是问题是由于这是基类中虚拟方法的实现这一事实,但我没有在网上发现任何暗示这就是问题。我做错了什么?
答案 0 :(得分:4)
问题在于dipole
是引用类型。关于va_start
,引用[support.runtime] / 3:
参数parmN是最右边参数的标识符 在函数定义的变量参数列表中(恰好在......之前)。如果是参数 parmN使用函数,数组或引用类型声明,或者使用与...不兼容的类型声明 在传递没有参数的参数时产生的类型,行为是未定义的。
答案 1 :(得分:0)
将声明更改为......
GameObject * SphereObstacle :: cloneNew(const Vector& position,double charge,Vector dipole,...)