为什么C++中vtk对象的浅拷贝的变化不会影响原始对象

问题描述 投票:0回答:1

我有以下 C++ 代码:

vtkNew _surf;
_surf->ShallowCopy(surf);
vtkIdType cellId = Get_ClosestCellId(_surf, seedxyz);
_surf->DeleteCell(cellId);
_surf->RemoveDeletedCells();

创建

_surf
后,我们将其指定为
ShallowCopy
surf
,然后通过调用
seedxyz
删除最接近
_surf->DeleteCell

的单元格

我想,如果我像这样

ShallowCopy
,由于
_surf
surf
共享同一个指针,对
_surf
所做的修改也会反映在
surf
中。

但是,如果以 vtp 格式输出两者,

_surf
会被修改,但
surf
不会显示更改。这是为什么?

vtk
1个回答
0
投票

如果我们知道该对象

surf
,我们可以检查文档来确定。

我做了这个非常简单的例子。

#include <stdio.h>

class A{
public:
    float* pos;
    A* ShallowCopy(){
        A* a = new A();
        a->pos = pos;
        return a;
    }

};

int main(int argc, char** args){
    A* surf = new A();
    float* pos = new float[1];
    pos[0] = 5;
    surf->pos = pos;
    A* b = surf->ShallowCopy();

    printf(" startt: %f\n", surf->pos[0]);

    b->pos[0] = 10;

    printf(" first: %f\n", surf->pos[0]);

    float* other = new float[1];
    other[0] = 20;
    b->pos = other;
    printf(" after: %f\n", surf->pos[0]);

}

输出为:

起始:5.000000
第一:10.000000
之后:10.000000

其想法是,浅拷贝使用相同的支持数据

pos
,因此
pos
的更改会反映在两个副本中。这两个对象都有自己的指向
pos
的指针,因此当您
b->pos =  other
时,它不会反映在
surf

© www.soinside.com 2019 - 2024. All rights reserved.