复制带有指向用户定义类型的指针的类的构造函数

时间:2015-07-08 21:44:48

标签: c++ shared-ptr copy-constructor deep-copy

我已经看到许多类的复制构造函数示例,其中成员变量作为指向int或char的指针。有人可以建议使用成员ptrB为类A编写复制构造函数的正确方法,该成员是指向用户定义的类B的指针。

这是否正确:

class A {
    private:
      B *ptrB;
    public:
      A() { ptrB = new B; }
      A(const A& other);
      ~A();
}

A::A(const A& other)
{
  ptrB = new B;
  *(ptrB) = *(other.ptrB);
}

并且如果ptrB定义如下:

shared_ptr<B> ptrB;
那么这个?

A::A(const A& other)
{
  ptrB(new B);
  *(ptrB) = *(other.ptrB);
}

感谢。

2 个答案:

答案 0 :(得分:1)

由于您使用“深层复制”标记了帖子,我假设您希望复制构造函数执行此操作。使用shared_ptr生成的默认复制构造函数执行深层复制。

我建议有两种复制指针式成员的一般形式。

main.o: main.c StarterWare_Files/test.h StarterWare_Files/add.h
    $(CC) -o $@ -MD -MP $(CPPFLAGS) $(CFLAGS) -c $^

Deep(const Deep& other): ptr(new T(*other.ptr)) {}

注意,像这样的浅表副本不适用于unique_ptr。根据设计,unique_ptr可以防止这种情况。

以下是每个示例,显示差异。 Nb,在实践中使用原始版本很容易导致内存泄漏。重要的是,在浅拷贝之后,修改副本会修改原始文件。

Shallow(const Shallow& other) = default;

http://ideone.com/NltfUO

答案 1 :(得分:-1)

好的,如评论中所示,答案是:

在裸指针的情况下我的代码可以正常工作,但这是一个更好的版本,因为使用初始化列表并且表现更好:

A::A(const A& other):ptrB(new B(other.ptrB)) {}

在shared_ptr的情况下,我不需要复制构造函数和析构函数。