用派生类填充基类类型的2D矢量

Fill 2D Vector of type Base class with derived class

本文关键字:2D 矢量 类型 基类 派生 填充      更新时间:2023-10-16

我有一个基类Organism,它有两个派生类Ant和Doodlebug。这是一个捕食问题。我想要一个基类类型的2d向量,但能够分配派生类的元素。其想法是,这将在一个20 X 20个字符的映射中表示世界的状态,如果元素是基,则字符为",而如果元素是派生的,则它将是不同的字符。

我读过关于如何在一维向量的情况下进行操作的文章,但我找不到声明指向二维向量的指针的正确语法。这是我所拥有的,如果我试图放置,我会出错:

vector < vector<Organism*> > state(20, vector<Organism*>(20));

但这就是编译但打印出数字字段而不是字符的内容:

vector < vector<Organism> > state(20, vector<Organism>(20));
string line;
int stateline = 0;
while(getline(ini_state_file, line))
{
    for(int i = 0; i < line.size(); i++)
    {
        if(line[i] == 'o')
            state[stateline][i] = Ant();
        else if(line[i] == 'X')
            state[stateline][i] = Doodlebug();
    }
    stateline++;
}
// or some smart_ptr instead native pointer.
vector<vector<Organism*> > state(20, vector<Organism*>(20));
string line;
int stateline = 0;
while(getline(ini_state_file, line))
{
    for(int i = 0; i < line.size(); i++)
    {
        if(line[i] == 'o')
            state[stateline][i] = new Ant();
        else if(line[i] == 'X')
            state[stateline][i] = new Doodlebug();
    }
    stateline++;
}

不要忘记释放内存。当你使用这个向量的工作结束时,你必须释放内存,例如。

for (int i = 0; i < state.size(); ++i)
{
    for (int j = 0; j < state[i].size(); ++j)
    {
        delete state[i][j];
    }
}

或者使用迭代器或算法作为for_each索引
如果要使用智能指针,则不应释放内存。