2012-11-04 56 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是一個引用類型。關於va_start,援引[support.runtime]/3:

參數parmN是最右邊的參數 的在函數定義的可變參數列表中的標識符(所述一個之前剛剛...)。如果使用函數,數組或參考類型聲明參數 parmN,或者使用與傳遞沒有參數的參數傳遞參數時產生的 類型不兼容的類型,則行爲未定義。

+0

啊OK,所以把充電參數最後應該解決的問題呢?你可以在省略號內傳遞額外的參考參數還是這個問題? – Pat

0

變化的宣言一樣......

遊戲對象* SphereObstacle :: cloneNew(常量向量&位置,雙充,矢量偶極子,...)