0

我正在尝试在 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 读取时,它都会返回一个巨大的值。它几乎看起来像是一个指针。我唯一的想法是问题是由于这是基类中虚拟方法的实现这一事实引起的,但我没有在网上找到任何表明这是问题的东西。我做错了什么?

4

2 回答 2

4

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

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

于 2012-11-04T22:20:00.557 回答
0

更改声明,如...

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

于 2012-11-06T07:34:43.273 回答