2016-12-28 61 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