【问题标题】:How to make a deep copy? [closed]如何制作深拷贝? [关闭]
【发布时间】:2017-05-13 06:12:37
【问题描述】:

所以基本上假设我现在有 2 节课。 1个叫Human,另一个叫House。

我现在所做的就是让房子制造和摧毁人类,所以基本上在我有的房子.h文件中

    Human *humanP;

在 .cpp 文件构造函数中

    humanP = new Human;
    humanP->something(); // lets me access the methods in the Human class

据我所知,这构成了一个组合,而 House 创建/销毁了 Human 对象。但我需要为我的 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 类中,然后在那里销毁。据我所知,我需要对其进行深层复制,以便我可以复制 House 类中的 humanO,然后删除主文件中的对象。

我一直在寻找低谷示例,但有很多不同的示例,任何人都可以编写代码来制作这个在 main 中创建的 Human 对象的深层副本吗?

编辑:

在这里进行编辑而不是回复,因为在这里编写代码更容易。

好吧,另一个愚蠢的问题。如果我使用简单的方法

Human *newPerson = new Human

然后做

House house;
house.addHuman(newPerson)

同时拥有类方法

addHuman(Human *other)
{
   this->humanP = other;
   cout << humanP->getAge() << endl << endl << endl;
}

它工作得很好,给了我年龄。

如果我使用智能指针它不起作用,我应该改变什么?它给了我诸如“没有匹配功能”之类的错误。我应该在addHuman() 中输入什么参数,以便它可以使用智能指针?

【问题讨论】:

  • 你有复制构造函数吗?无论如何,House 为什么要定义那个humanP 成员?它代表什么?
  • 也许尽量避免使用new。如果您将std::vector&lt;Human&gt; humans 放入House 类中,那么它将使用默认的复制构造函数进行复制。 Is this homework?
  • 如果您发布一些尝试深拷贝的代码,它会更容易提供帮助。
  • "这样我就可以复制 House 类中的 humanO,然后删除主文件中的对象。" - 只需在 House 类中使用 Human 值,而不是指针。
  • 这是我项目的一部分,其中一项任务是基本进行合成和深拷贝。我会在几分钟内进行编辑。基本上,房子是工作和组织其他班级的主要班级。人类属于房子,这就是为什么它被放在那里。好的,我已经看到了一个带有矢量的示例,让我看看我可以编辑什么

标签: c++ oop deep-copy


【解决方案1】:

深拷贝仅仅意味着您已为第二个副本分配空间并将原始内容复制到该空间中,与浅拷贝相反,浅拷贝实际上是指向原始对象的“指针”,之后变为无效原件被销毁。

如果您必须拥有多个数据所有者,则只需要一份深层副本。如果您的 House 对象打算拥有数据,那么创建一个 Human' dynamically and then passing it to theHouse` 实例就可以解决问题。

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);

如果HouseHuman 对象存储在向量中,并且 Human 对象可以简单地复制:

m_Humans.PushBack(newHuman);

【讨论】:

  • 所以基本上我必须在 House 类中编写额外的方法来获取一个 Human 类型指针,并且在该方法中我创建了另一个 Human 类型指针,只是让 pointer1 = pointer2?我可以对构造函数做同样的事情吗? newPerson 传递后可以删除吗?
  • @Johnie78 pointer1=pointer2 将是浅拷贝。我在我的答案中添加了更多内容来处理对深拷贝的需求。
  • 谢谢!现在更清楚了。是的,我现在看到那将是一个浅拷贝,两者都指向同一个东西,无法删除主目录中的那个
  • 另一个问题,我的编译器不支持 make_unique thingy,我发现你可以使用模板来编写所有内容,就像这里 link 一样,你能用这个重写它吗? @米克尔
  • @Johnie78 添加了更新以通过构造函数创建 unique_ptr。
猜你喜欢
  • 2012-06-01
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 2012-04-12
  • 2013-04-06
相关资源
最近更新 更多