首页 > 解决方案 > 将列表指针传递给函数的问题

问题描述

在我的程序中,我有一个列表,它是一个指针list<COffenceUnit*>* m_attack = nullptr;,我像这样初始化这个列表:m_attack = new list<COffenceUnit*>();在构造函数中。在代码中的某个时刻,我想将此列表发送给另一个构造函数作为参考。这是接收列表的构造函数:

GameMap::GameMap(const std::list<CDefenceUnit*>* &defenseUnits, const std::list<COffenceUnit*>* &offenseUnits)
{
    mGameMap = new int* [GRID_SIZE];
    for (int i = 0; i < GRID_SIZE; ++i)
        mGameMap[i] = new int[GRID_SIZE];

    updateMap(defenseUnits, offenseUnits);
}

但是编译器会抛出一个错误,上面写着:

Error   C2664   'GameMap::GameMap(const GameMap &)': cannot convert argument 1 from
'std::list<CDefenceUnit *,std::allocator<_Ty>> **' to 'const std::list<CDefenceUnit *,std::allocator<_Ty>> *&'

我无法弄清楚我在这里做错了什么。

标签: c++pass-by-reference

解决方案


您尝试使用指向列表的指针 ( std::list<...>**) 调用函数,但该函数需要指向列表的指针 ( std::list<...>*),因此转换失败。

取消引用参数以删除一级指针。例如,如果您有GameMap(defenseUnits),则将其更改为GameMap(*defenseUnits).


此外,您几乎不应该new使用 std 容器,因此要初始化您m_attack的 ,建议在没有new(即没有动态分配)的情况下进行,如下所示:

list<COffenceUnit*> m_attack;

然后你也不需要m_attack = list<COffenceUnit*>();稍后再做,因为列表已经被列表的构造函数默认初始化。

这也可以帮助您避免多级指针,例如在std::list<...>**.


此外,您可能想要std::vector代替std::list,后者很少是更好的选择。


推荐阅读