2013-02-17 30 views
0

忍無可忍,我在C++上相對較新。我有一個向量的基類和派生類對象,但我無法訪問被存儲在向量中的派生對象繼承的數據成員

這是我的項目。我想本質上創建一個簡單的國際象棋遊戲。

我有一個基類遊戲幣,這我想最終會成爲一個抽象類(但現在它是不)

基類遊戲幣有一堆在它的數據成員: colorOfPiece,rankOfPiece,fileOfPiece等。它也有一個函數,void displayPieceInfo(),它通過cout簡單地在控制檯上顯示所有這些值。

我正計劃從這一個派生類派生。現在我有一個「白嘴鴉」子類。

我想在單個向量中添加各種類型的塊,所以我可以稍後使用迭代器遍歷它。

這是我遇到的問題。

vector<gamePiece> vectorOfAllGamePieces; 
vector<gamePiece>::iterator itGamePieces; 

我將一個Rook作爲第一個元素push_back作爲向量。所有的構造函數看起來都很好,初始化變量。然而,當我嘗試在第一個元素上運行顯示功能時,這些字符串是空的/單元化的。

itGamePieces=vectorOfAllGamePieces.begin(); 
itGamePieces->displayPieceInfo(); 

如果我將一個通用的gamePiece插入到vector中,所有東西都會正確顯示。

我是否允許使用混合類型的對象來創建這樣的向量 - 例如,派生類的對象,父類的對象,派生自同一個父類的第二個類的對象

如果是這樣,爲什麼你認爲數據成員的值沒有正確顯示,即使我已經在構造函數中設置了它們?

+1

切片的樂趣。事實上,你並不具有基礎和派生的向量。該矢量只包含鹼基。 – Mat 2013-02-17 19:33:16

回答

3

不是真的,因爲切片。當您將派生對象添加到vector<gamePiece>時,它會被切片並且gamePiece對象實際上被添加到該向量。

您需要使用(智能)指針向量。

1

問題就是這樣,RookGamePiece。但是你不能在一個GamePieces的地方存儲一個Rook。您只能將轉換成 a Pointer to Rook轉換爲Pointer to GamePiece。所以你的矢量必須保存不是GamePiecesGamePiece *(指向GamePieces)。

std::vector<GamePiece *> vectorOfAllGamePieces; 

但是,這可能會給你在內存管理上的麻煩。另一種方法是在不使用指針的情況下存儲Handles。 (一個句柄就像一個指向指針的指針)。或者當然你可以使用智能指針。

快速黑客會(這是一個「黑客」,這是在一些人眼中的「邪惡」),

std::vector<Rook> allRooks; 
std::vector<Pawns> allPawns; 
..... 
std::vector<Queen> allQueens; 
King theKing; 

std::vector<GamePiece *> allPieces; 

allPieces將包含指向在其他載體的對象。 我認爲當你確切地知道所有類型的棋子時(我猜這是國際象棋),這種方法是可以的。

相關問題