2015-10-18 76 views
0

我真的搜查所有在互聯網上,無法找到一個方法來解決它,所以這裏是我的問題:推回子類對象基類的2D矢量在C++

我創建了一個名爲「GridPoint公司」類來表示一個二維地圖的每個點,然後是一個類型爲Gridpoint *的二維矢量來存儲和打印整個地圖(n^2個網格對象)

另外,我有一個名爲「Ship」的基類(包含船一般情況下)和6個具有額外功能的船舶(例如「海盜」)的子類。

所以,我想創建一個空的帶有6行的Ship類型的2d向量來存儲每個子類創建的對象。 (例如第4行 - >所有海盜船)。

但是,儘管所有對象(來自Ship子類)都已成功創建,但矢量中並未存儲任何內容,並且它仍爲空。

我應該怎樣做push_back成功push_back每個對象在正確的行,它創建的那一刻?

下面是「參與」向量和對象的創建和push_back(僅適用於子類Pirate)的所有函數的簡化版本。欲瞭解更多信息或代碼,只是問我:

void createShip0(vector<vector<GridPoint*>, vector<vector<Ship*> >, int, int, double, double, int, int, int) 

int main() 
{ 
    int n = 10; 

    vector<GridPoint*> gcol(n); 
    vector<vector<GridPoint*> > GridMap(n, gcol); 

    vector<vector<Ship*> > ShipArray(7); 

    int i = rand() % n; 
    int j = rand() % n; 
    double MxEnd = rand() % 5 + 5; 
    int Sped = rand() % 3 + 1; 

    createShip0(GridMap, ShipArray, i, j, MxEnd, MxEnd, Sped, 0, n); 
} 


void createShip0(vector<vector<GridPoint*> > GridMap, vector<vector<Ship*> > ShipArray, int xIn, int yIn, double MaxEnd, double CurEnd, int Speed, int TreasQ, int n) 
{ 
    Pirate::createShip(GridMap, ShipArray, xIn, yIn, MaxEnd, CurEnd, Speed, TreasQ); 
} 



void Pirate::createShip(vector<vector<GridPoint*> > GridMap, vector<vector<Ship*> > ShipArray, int xIn, int yIn, double MaxEnd, double CurEnd, int Speed, int TreasQ) 
{ 
    Pirate* obj = new Pirate(xIn, yIn, MaxEnd, CurEnd, Speed, TreasQ); 
    ShipArray.at(3).push_back(obj); 
} 
+1

你應該嘗試將此降低到MCVE。提示:它與「2D矢量」無關。 – juanchopanza

回答

0

createShip0功能的值取其所有參數,這意味着他們是在函數體的本地副本,在主叫側看不見。你正在做的這相當於:

void foo(int n) { n += 42; } 

然後

int i = 0; 
foo(i); 
stc::cout << i << std::endl; // Output: 0 

,並期待i已被42遞增。如果你想在函數的參數在發送方進行修改,你需要通過參考,而不是通過他們:

void foo(int& n) { n += 42; } 
//  ^
+0

好吧,我明白了。我怎麼寫它的載體? 我應該將其替換爲「vector >&GridMap」和「vector >&ShipArray」? – Ezlen

+0

@Ezlen是的。在深入研究2D矢量之前學習一些基本的C++可能會更有成效。 – juanchopanza

+0

它的工作原理,謝謝! – Ezlen