原理
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对象在离开函数时就被自动删除。
未来还有什么案例再补充在这里。