vtk ShallowCopy DeepCopy使用

 原理

The constructor, destructor, operator=, and copy constructor methods are either protected or private members of most VTK class.

                                                                                 Pg 302 VTK User Guide

vtkX class 禁用了构造函数vtkX(),析构函数~vtkX(),赋值函数operator=(const vtkX &),拷贝函数vtkX(const vtkX&)

只有用ShallowCopy()或者DeepCopy(), 两者的区别是在shallow只是copy了reference,两个pointer共用了一个对象,任何改动都会影响到彼此。DeepCopy()是真正的数据copy,产生两份独立的数据。

A shallow copy is a copy of an object that copies references to objects (via reference counting) rather than the objects themselves. In a shallow copy, replication of data is avoided.

Alternatively, a DeepCopy() can be used to copy an instance, including any data it represents, without any references to other objects.

实践

主要是函数传参时用到。这里将PolyData传入函数,做一些filtering,再传出处理后的polyData.

Ex1 1in, 1out

vtkSmartPointer<vtkPolyData> doSomething(vtkSmartPointer<vtkPolyData> inputPoly)
{
    auto PolyA = doParts(inputPoly,argA);
    return PolyA;
}

auto polyDataA = doSomething(inputPoly);

 这样写没有问题,是因为返回smart pointer, reference count increase, 当离开这个函数时,对象不会被删除。 

Ex2 1in, 2out

这里要用到ShallowCopy()

doSomething(vtkSmartPointer<vtkPolyData> inputPoly, vtkSmartPointer<vtkPolyData> outPutPolyA, vtkSmartPointer<vtkPolyData> outPutPolyB)
{
    bisect(inputPoly, argA,argB);
    auto PolyA = doParts(inputPoly,argA);
    auto PolyB = doParts(inputPoly,argB);   

    outPutPolyA->ShallowCopy(PolyA);
    outPutPolyB->ShallowCopy(PolyB);   
}

vtkNew<vtkPolyData>  polyA, polyB;	
doSomething(inputPoly,polyA,polyB)

这里如果直接写成

outPutPolyA = doParts(inputPoly,argA);

或者

outPutPolyA = PolyA;

compile可以过,运行起来什么都没发生,debug后,发现函数传出来的数据是空的。

因为这样做并没有增加对象引用,创建的PolyA,PolyB对象在离开函数时就被自动删除。

未来还有什么案例再补充在这里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值