0

我有一个基类 Organism,它有 2 个派生类 Ant 和 Doodlebug。这是针对捕食者 - 猎物问题。我想要一个基类类型的二维向量,但能够分配派生类的元素。这个想法是这将在 20 X 20 字符映射中表示世界的状态,其中如果元素是基础,则 char 是 ' ',而如果元素是派生的,它将是不同的 char。

如果它是一维向量,我读到了如何做到这一点,但我找不到声明指向二维向量的指针的正确语法。这就是我所拥有的,如果我尝试输入会出错:

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++;
}
4

1 回答 1

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++;
}

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

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

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

于 2012-07-10T16:32:39.533 回答