如何进行深拷贝?
How to make a deep copy?
所以基本上假设我现在有 2 classes。 1个叫Human,一个叫House
我现在所做的是房子创造和毁灭人类,所以基本上在房子.h 文件中我有
Human *humanP;
并在 .cpp 文件构造函数中
humanP = new Human;
humanP->something(); // lets me access the methods in the Human class
据我所知,这使得组合和房屋 creates/destroys 成为人类对象。但是我需要向我的 Human 对象添加参数,例如身高和年龄。
主要是我想要
int age, height;
cout << "Whats your age? << endl;
cin >> age;
cout << "Whats your height? << endl;
cin >> height;
我想用这个
Human humanO(age, height);
这将使用这些参数创建 Human 对象。但我仍然希望将 Human 对象保存在 House class 中,然后在那里销毁。据我所知,我需要对其进行深度复制,以便我可以复制 House class 中的 humanO,然后删除主文件中的对象。
我一直在寻找例子,但有很多不同的例子,任何人都可以编写代码来对在 main 中创建的这个 Human 对象进行深度复制吗?
编辑:
在这里进行编辑而不是回复,因为在这里编写代码更容易。
好的,又是一个愚蠢的问题。如果我使用带有
的简单方法
Human *newPerson = new Human
并做
House house;
house.addHuman(newPerson)
同时拥有 class 方法
addHuman(Human *other)
{
this->humanP = other;
cout << humanP->getAge() << endl << endl << endl;
}
它工作正常并告诉我年龄。
如果我使用智能指针它不起作用,我应该更改什么?它给了我像 "no matching function" 这样的错误。我应该在 addHuman()
中放入什么参数,以便它可以使用智能指针?
深拷贝仅仅意味着你已经为第二个拷贝分配了 space 并将原始内容复制到那个 space,而不是浅拷贝,这实际上是一个 'pointer'到原始对象被销毁后失效。
如果您必须拥有多个数据所有者,则只需要深拷贝。如果您的 House
对象打算拥有数据,创建一个 Human' dynamically and then passing it to the
House` 实例就可以了。
Human *newPerson = new Human(age,height);
house->AddHuman(newPerson);
或者,如果您想利用智能指针:
std::unique_ptr<Person> newPerson = std::make_unique<Person>(age,height);
或
std::unique_ptr<Person> newPerson(new Person(age,height));
然后
house->AddHuman(std::move(newPerson));
如果您的项目绝对需要执行深拷贝,那么您可能不想在本地分配。
house->AddHuman(Person(age,height));
其中 House
有一个新方法,AddHuman()
看起来像这样:
void House:AddHuman(Person& newHuman);
如果House
将Human
个对象存储在向量中,和Human
个对象可以简单地复制:
m_Humans.PushBack(newHuman);
所以基本上假设我现在有 2 classes。 1个叫Human,一个叫House
我现在所做的是房子创造和毁灭人类,所以基本上在房子.h 文件中我有
Human *humanP;
并在 .cpp 文件构造函数中
humanP = new Human;
humanP->something(); // lets me access the methods in the Human class
据我所知,这使得组合和房屋 creates/destroys 成为人类对象。但是我需要向我的 Human 对象添加参数,例如身高和年龄。
主要是我想要
int age, height;
cout << "Whats your age? << endl;
cin >> age;
cout << "Whats your height? << endl;
cin >> height;
我想用这个
Human humanO(age, height);
这将使用这些参数创建 Human 对象。但我仍然希望将 Human 对象保存在 House class 中,然后在那里销毁。据我所知,我需要对其进行深度复制,以便我可以复制 House class 中的 humanO,然后删除主文件中的对象。
我一直在寻找例子,但有很多不同的例子,任何人都可以编写代码来对在 main 中创建的这个 Human 对象进行深度复制吗?
编辑:
在这里进行编辑而不是回复,因为在这里编写代码更容易。
好的,又是一个愚蠢的问题。如果我使用带有
的简单方法Human *newPerson = new Human
并做
House house;
house.addHuman(newPerson)
同时拥有 class 方法
addHuman(Human *other)
{
this->humanP = other;
cout << humanP->getAge() << endl << endl << endl;
}
它工作正常并告诉我年龄。
如果我使用智能指针它不起作用,我应该更改什么?它给了我像 "no matching function" 这样的错误。我应该在 addHuman()
中放入什么参数,以便它可以使用智能指针?
深拷贝仅仅意味着你已经为第二个拷贝分配了 space 并将原始内容复制到那个 space,而不是浅拷贝,这实际上是一个 'pointer'到原始对象被销毁后失效。
如果您必须拥有多个数据所有者,则只需要深拷贝。如果您的 House
对象打算拥有数据,创建一个 Human' dynamically and then passing it to the
House` 实例就可以了。
Human *newPerson = new Human(age,height);
house->AddHuman(newPerson);
或者,如果您想利用智能指针:
std::unique_ptr<Person> newPerson = std::make_unique<Person>(age,height);
或
std::unique_ptr<Person> newPerson(new Person(age,height));
然后
house->AddHuman(std::move(newPerson));
如果您的项目绝对需要执行深拷贝,那么您可能不想在本地分配。
house->AddHuman(Person(age,height));
其中 House
有一个新方法,AddHuman()
看起来像这样:
void House:AddHuman(Person& newHuman);
如果House
将Human
个对象存储在向量中,和Human
个对象可以简单地复制:
m_Humans.PushBack(newHuman);