Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个语句调用这个析构函数?_C++_Arrays_Templates_Destructor - Fatal编程技术网

C++ 为什么这个语句调用这个析构函数?

C++ 为什么这个语句调用这个析构函数?,c++,arrays,templates,destructor,C++,Arrays,Templates,Destructor,我有两个名为arrContainer和pArrContainer的模板类。arrContainer的作用与vector类非常相似,基本上是动态数组的包装器,编写它是为了简化动态数组的内存管理,pArrContainer的工作原理与arrContainer几乎相同,只是它用于指针的动态数组。其思想是,它将清除用于动态数组的内存,以及清除数组中指针的内存 此外,我有一个类棋盘,代表棋盘游戏中的一个棋盘。它用来实现这一点的基本成员是arrC_board,一个arrccontainer

我有两个名为arrContainer和pArrContainer的模板类。arrContainer的作用与vector类非常相似,基本上是动态数组的包装器,编写它是为了简化动态数组的内存管理,pArrContainer的工作原理与arrContainer几乎相同,只是它用于指针的动态数组。其思想是,它将清除用于动态数组的内存,以及清除数组中指针的内存

此外,我有一个类棋盘,代表棋盘游戏中的一个棋盘。它用来实现这一点的基本成员是arrC_board,一个arrccontainer>,其中Tile是用于表示板上每个Tile的模板类,而Piece是用于表示板上各个块的类

图中描绘了瓷砖的内部结构。由于它用于工件,tmp将是工件:

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