2016-12-28 63 views
0

所以基本上让我们说我现在有2个班。 1被称为人类,另一个被称为众议院。如何进行深层复制?

我现在做的是取得的房屋制造和众议院.h文件中会破坏人的,所以基本上我有

Human *humanP; 

而在.cpp文件构造

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

据我所知,这使得一个组合和房子创建/破坏人类的对象。但是我需要为我的Human对象添加参数,例如高度和年龄。

在主我想有像

int age, height; 

cout << "Whats your age? << endl; 
cin >> age; 
cout << "Whats your height? << endl; 
cin >> height; 

有了这个,我想使

Human humanO(age, height); 

,这将创造这些参数人类对象。但我仍然希望人类对象在House类中被关闭,然后在那里被销毁。据我所知,我需要做一个深层次的副本,以便我可以将HouseO复制到House类中,然后删除主文件中的对象。

我一直在寻找低谷例子,但也有相当多的不同者,任何人都可以写什么代码看起来像做是在主创建此人对象的深层副本?

编辑:

制作编辑在这里,而不是回答的原因,而是更容易在这里写的代码。

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

Human *newPerson = new Human 

,做

House house; 
house.addHuman(newPerson) 

具有类方法

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

它工作正常,并给我的年龄时。

如果我使用智能指针它不工作,我应该怎么改?它给我错误,如“没有匹配功能”。我应该将哪些论据放入addHuman(),以便它能够使用智能指针呢?

+0

你有拷贝构造函数吗?为什么House会定义这个humanP成员呢?它代表什么? – user2357112

+3

也许试着避免使用'new'。如果您在'House'类中放置了'std :: vector '',那么它将被复制到默认的拷贝构造函数中。 [这是家庭作业](http://meta.stackoverflow.com/questions/334822/how-do-i-ask-and-answer-homework-questions)? – wally

+0

如果您发布一些代码尝试深层复制,它会更容易帮助。 – wally

回答

2

深副本只是意味着你已经分配给第二个副本的空间和复制原有的内容到那个空间,而不是一个浅拷贝,这实际上是一个“指针”到变为无效原始对象原件被销毁后。

如果你必须有数据的一个以上的业主只需要深拷贝。如果你的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)); 

如果您的项目绝对需要执行一个深层复制,然后你是概率bly不想在本地分配。

house->AddHuman(Person(age,height)); 

House有一个新的方法,AddHuman()看起来是这样的:

void House:AddHuman(Person& newHuman); 

如果HouseHuman物体的向量,Human对象可以平凡复制:

m_Humans.PushBack(newHuman); 
+0

因此,基本上我必须在House类中编写额外的方法,它获得一个Human类型的指针,并在该方法内部创建另一个Human类型的指针,然后使pointer1 = pointer2?我可以使用构造函数吗?我传递后可以删除newPerson吗? – Johnie78

+1

@ Johnie78 pointer1 = pointer2将是一个浅拷贝。为了处理需要进行深层复制的问题,我添加了更多内容。 –

+0

谢谢!现在更清楚了。是的,我现在看到,这将是一个浅拷贝,都指向相同的东西,无法删除主 – Johnie78