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 に答える