C++ 为什么这个语句调用这个析构函数?
我有两个名为arrContainer和pArrContainer的模板类。arrContainer的作用与vector类非常相似,基本上是动态数组的包装器,编写它是为了简化动态数组的内存管理,pArrContainer的工作原理与arrContainer几乎相同,只是它用于指针的动态数组。其思想是,它将清除用于动态数组的内存,以及清除数组中指针的内存 此外,我有一个类棋盘,代表棋盘游戏中的一个棋盘。它用来实现这一点的基本成员是arrC_board,一个arrccontainerC++ 为什么这个语句调用这个析构函数?,c++,arrays,templates,destructor,C++,Arrays,Templates,Destructor,我有两个名为arrContainer和pArrContainer的模板类。arrContainer的作用与vector类非常相似,基本上是动态数组的包装器,编写它是为了简化动态数组的内存管理,pArrContainer的工作原理与arrContainer几乎相同,只是它用于指针的动态数组。其思想是,它将清除用于动态数组的内存,以及清除数组中指针的内存 此外,我有一个类棋盘,代表棋盘游戏中的一个棋盘。它用来实现这一点的基本成员是arrC_board,一个arrccontainer
template <typename tmp>
class Tile
{
protected:
...
tmp* tmp_occupant;
public:
Tile();
~Tile();
tmp* getOccupant() const {return tmp_occupant;}
...
};
arrContainer的下标运算符看起来与pArrContainer的相同。
磁贴的getOccupant()
功能:
template <typename tmp>
tmp* Board<tmp>::getElement(int I, int J) const
{
if (I >= 0 && J >= 0 && I < i_rows && J < i_columns)
{
Piece* occupant = arrC_board[I][J]->getOccupant();
return occupant;
}
else
....
}
tmp* getOccupant() const {return tmp_occupant;}
对于这个问题所需的阅读量,我深表歉意。
arrContainer的下标运算符与pArrContainer的下标运算符看起来相同。这就是你的问题,我想——如果arrContainer
的操作符[]
返回一个模板类型的对象,在这种情况下,模板类型是另一个对象(pArrContainer
),那么当你返回它时,你正在创建一个副本,在使用后,但在RHS上的值分配给乘员之前,它会被销毁。嗯,它看起来不完全一样。arrContainer的操作符[]
返回一个tmp&,因此它不会返回ParrContainer的副本。我不敢相信,但你是对的。令我怀疑的是,arrContainer的操作符[]
应该返回tmp&,但在我使用的文件版本中,它仍然返回tmp。令人尴尬的非常感谢你。嘿,那句老话“但我已经改变了!”虫子:-)很高兴我能帮上忙。
template <typename tmp>
tmp* pArrContainer<tmp>::operator[] (const int index)
{
if (index >= size)
{
...//this part isnt executed
}
else
return heldArray[index];
}
tmp* getOccupant() const {return tmp_occupant;}