2012-08-05 76 views
1

背景:C++如何設置類型性病的指針:: vector的<Derived*>類型爲std反對:: vector的<Base*>

我建立一個物理引擎,在C++中,計算一個正的引力變化笛卡爾空間中的身體系統,然後將其轉換爲任何預定義的座標系統。最終目標是使起始座標系統成爲任意角度(在座標系統'n'中而不是笛卡爾座標系中計算),但這是一個遙遠的目標。

問題:

由於座標系被認爲是可互換的,我已經做了笛卡爾座標系延伸的基部座標系統:

class CoordMember { 
} 

class CoordState { 
    public: 
     /* methods to operate on members */ 

    protected: 
     std::vector<CoordMember*> members; 
} 

class Particle : public CoordMember { 
} 

class CartState : public CoordState { 
} 

錯誤試圖建立一個指針,當出現類型的std::vector<Particle*>指向成員std::vector<CoordMember*>類型的對象:

CartState* state = new CartState(/* initialization vars */); 
std::vector<Particle*>* parts = static_cast< std::vector<Particle*>* >(&state->members); 

編譯錯誤是:

error: static_cast from 'std::vector<CoordMember *> *' to 'std::vector<Particle *> *' is not allowed 
error: no viable overloaded '=' 

我知道在這一點上,在state->members數據都Particle*類型的事實。我不知道做什麼才能使這個演員成爲可能。有任何想法嗎?

TL;博士:

std::vector<Derived*>* ptr = static_cast< std::vector<Base*>* >(&object); 
static_cast from 'std::vector<Derived*>*' to 'std::vector<Base*>*' is not allowed 

回答

5

鑄造不起作用,因爲vector s爲完全無關。您必須在矢量中投射每個單獨的對象。

+0

我該怎麼做?我不想將成員向量的內容複製到不同類型的向量中(因爲我想對原始成員函數進行操作),我只想將向量作爲派生類型的向量來處理函數調用。 – chpatton013 2012-08-05 22:17:12

+1

@ chpatton013你不能,你不必複製它。在使用它們之前,只需將矢量內的元素轉換爲所需的類型即可。 – 2012-08-05 22:28:12

+3

正如我假設的那樣,你將使用它們的多態性,解決方案首先要維護一個「矢量」。一定要爲'Base'類定義一個虛擬析構函數。 – marko 2012-08-05 22:35:58

相關問題