1

当对象作为参数传递给另一个类的构造函数时,我根本不明白为什么要调用析构函数。这是出现问题的代码部分:

Ocean* sea=new Ocean(4,3,7);
sea->print();
RunLengthEncoding* s2= new RunLengthEncoding(*sea);
sea->print();

构造函数的代码:

RunLengthEncoding::RunLengthEncoding(Ocean sea)
{
oceanEncoding = new MyLinkedListD();
height = sea.height();
width=sea.width();
starveT=sea.starveTime();
int length=1;
int cellType=sea.cellContents(0,0);
int hunger=sea.sharkFeeding(0,0);
for(int row=0;row<height;row++){
    for(int col=0;col<width;col++){
        if(row==0&&col==0){
            cellType=sea.cellContents(col,row);
            hunger=sea.sharkFeeding(col,row);
        }
        else{
            if(sea.cellContents(col,row)==cellType && ((cellType==Ocean::SHARK && hunger==sea.sharkFeeding(col,row))|| cellType!=Ocean::SHARK)){
                    length++;
            }
            else{
                oceanEncoding->add(cellType,length,hunger);
                cellType=sea.cellContents(col,row);
                length=1;
                hunger=sea.sharkFeeding(col,row);
            }
        }
    }
}
oceanEncoding->add(cellType,length,hunger);
internalPointer=oceanEncoding->getHead();
check();

}

4

3 回答 3

8

构造函数按值获取其参数。当构造函数返回时,复制、使用和销毁。

通过引用获取参数(最好使用 const 引用)。

于 2013-06-14T20:45:41.030 回答
1
RunLengthEncoding(*sea);

这需要一个值。不是指向值的指针,也不是对值的引用。编译器插入代码以创建一个值并将其传递给函数。在函数内部,如果你修改了值,它不会改变你想象中传入的值。函数被调用后,值被销毁。

*sea没有传递给函数。不能在函数内部修改。

于 2013-06-14T20:58:26.743 回答
0

由于一旦函数结束,构造函数就会按值获取其参数,因此对象超出范围并因此被销毁。由于您无法更改构造函数的参数,因此该对象将始终被销毁,因此解决此问题的唯一方法是创建在堆上分配的对象的新副本(因此它不会被销毁)但这并不是很好编码练习

于 2013-06-14T20:59:29.740 回答