gpt4 book ai didi

c++ - 在复制构造函数中复制任何指针成员变量

转载 作者:行者123 更新时间:2023-11-30 05:26:02 25 4
gpt4 key购买 nike

我有一个 B 类,它有一个成员,该成员是指向 A 类对象的指针。在 A 类型的对象上使用复制构造函数时,它被复制但成员变量没有。有没有办法复制 A 对象并自动复制其 B 成员?以下代码显示了我试图解释的问题:

class A
{
public:
A(char t_name)
{
name = t_name;
}
~A()
{
}
char name;
};

class B
{
public:
A* attribute;

B()
{
attribute = new A('1');
}
~B()
{}
};


int main()
{
B* b_variable = new B;
B* b_copy = new B(*b_variable);
return 0;
}

最佳答案

When using copy constructor on an object of type A, it is copied but the member variable is not.

您的代码永远不会调用 A 类中的任何复制构造函数。

您的代码调用 B 类中的复制构造函数,它完全按照预期的方式执行操作,即复制 attribute 的值,该值是指向 A 类的指针目的。

换句话说 - 在执行您的代码后,您有两个 B 类实例和一个 A 类实例。在两个 B 类实例中,attribute 指向同一个 A 类实例。

这(很可能)不是您想要的。

正如许多人已经指出的那样(例如,请参阅@lostbard 的回答),您将需要 B 类中的复制构造函数来执行深层复制。需要深拷贝,因为 B 类有一个指针成员。

您还应该在 B 类析构函数和 main 中进行一些清理。

#include <iostream>
using namespace std;

class A
{
public:
A(char t_name)
{
name = t_name;
}

~A()
{
}
char name;
};

class B
{
public:
A* attribute;

B()
{
attribute = new A('1');
}

/** Copy constructor */
B(const B &copy)
{
// Make a new instance of class A
attribute = new A(*copy.attribute);
}

/** Assignment operator */
B& operator= (const B& other)
{
// Delete the existing class A instance
delete attribute;
// and create a new as a copy of other.attribute
attribute = new A(*other.attribute);
}

~B()
{
// Delete the class A instance
delete attribute;
}
};


int main()
{
B* b_variable = new B;
B* b_copy = new B(*b_variable);

// Delete the two class B instances
delete b_variable;
delete b_copy;

return 0;
}

类 A 中不需要复制构造函数。默认生成的将执行,因为类 A 没有指针成员。

编辑

正如@Slava 所指出的,当您制作复制构造函数(三规则)时,您应该始终实现赋值运算符,因此我将其添加到上面的代码中。

有些人喜欢三的规则是五的规则,所以它也包括移动。在这里阅读更多:https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)

关于c++ - 在复制构造函数中复制任何指针成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38000132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com