我已经看到许多类的复制构造函数示例,其中成员变量作为指向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);
}
感谢。
答案 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;
答案 1 :(得分:-1)
好的,如评论中所示,答案是:
在裸指针的情况下我的代码可以正常工作,但这是一个更好的版本,因为使用初始化列表并且表现更好:
A::A(const A& other):ptrB(new B(other.ptrB)) {}
在shared_ptr的情况下,我不需要复制构造函数和析构函数。