使用派生类填充Base类的2D Vector

pos*_*ich 0 c++ vector derived-class

我有一个基类,有机体,有2个派生类,Ant和Doodlebug.这是捕食者 - 猎物的问题.我想要一个Base类的2d向量,但能够分配派生类的元素.这个想法是,这将代表20 X 20字符映射中的世界状态,如果元素是基础,则char是'',而如果元素是派生的,它将是不同的char.

我读到了如果它的一维向量如何做,但我找不到正确的语法来声明指向2d向量的指针.这就是我所拥有的,如果我试图放入,我会遇到错误:

vector < vector<Organism*> > state(20, vector<Organism*>(20));
Run Code Online (Sandbox Code Playgroud)

但这是编译但打印出一个数字字段而不是字符:

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++;
}
Run Code Online (Sandbox Code Playgroud)

For*_*veR 5

// 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++;
}
Run Code Online (Sandbox Code Playgroud)

不要忘记释放记忆.当您使用此向量的工作将结束时,您必须释放内存,例如.

for (int i = 0; i < state.size(); ++i)
{
    for (int j = 0; j < state[i].size(); ++j)
    {
        delete state[i][j];
    }
}
Run Code Online (Sandbox Code Playgroud)

或者使用迭代器或算法作为for_each而不是索引.
如果你想使用智能指针,你就不应该释放内存.