在C ++中推回基类类型2d向量中的子类对象

时间:2015-10-18 10:32:21

标签: c++ class vector push back

我真的在互联网上搜索过,无法找到解决问题的方法,所以这就是我的问题:

我创建了一个名为" Gridpoint"表示2d地图的每个点,然后是Gridpoint *类型的2d矢量来存储和打印整个地图(n ^ 2个Gridpoint对象)

另外,我有一个名为" Ship" (通常包含船只)和6个子类,用于各种类型的船舶,具有关于它们的额外功能(例如" Pirate")。

所以,我想创建一个空的2d矢量,类型为Ship *,有6行,每行存储由每个子类创建的对象。 (例如,第4行 - >所有海盗船只。)

但是,虽然所有对象(来自Ship子类)都是成功创建的,但是没有任何内容存储在向量中并保持为空。

我应该怎样做才能成功地将每个对象推送到正确的行,即它创建的那一刻?

以下是"参与"的所有功能的简化版本。在向量和对象的创建和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 个答案:

答案 0 :(得分:0)

你的createShip0函数按值获取所有参数,这意味着它们是函数体中的本地副本,在调用者端看不到。你正在做相同的事情:

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

然后

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

并期望i增加42。如果您希望在调用方修改函数的参数,则需要通过 reference 传递它们:

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