2016-12-28 9 views
0

だから基本的には2つのクラスがあるとしましょう。 1は人間と呼ばれ、もう1つは家と呼ばれます。ディープコピーを作成するには?

私が今行っているが、家が作ると私は

Human *humanP; 

を持って、家.hファイルでそう基本的に、人間を破壊すると判断された.cppファイルのコンストラクタ

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

で私が知る限り、これは構図を作り、家は人間の物を創造/破壊する。しかし、私は高さや年齢のように私の人間のオブジェクトにパラメータを追加する必要があります。メインで

私はそれらのパラメータを持つ人間のオブジェクトを作成します

Human humanO(age, height); 

を作りたい。これにより

int age, height; 

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

のようなものを持っていると思います。しかし、私はまだ人間のオブジェクトをハウスクラスで開催し、そこで破壊することを望んでいます。私が知る限り、私はそれを深くコピーする必要があるので、私はHouseクラスの中でhumanOをコピーしてから、メインファイル内のオブジェクトを削除することができます。

私はトラフの例を探していましたが、かなり異なるものがあります。メインで作成されたこのHumanオブジェクトのディープコピーを作成するコードはどのようなものか書くことができますか?

編集:

ここで編集を作る代わりに、それはここにコードを記述する方が簡単です原因返信。

もう別の愚かな質問です。クラスメソッド

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

を持ちながら、私は

Human *newPerson = new Human 

で簡単な方法を使用して

House house; 
house.addHuman(newPerson) 

を行う場合、それは正常に動作し、私の年齢を与えます。

スマートポインタを使用しても機能しない場合、どうすればよいですか?それは私に "no matching function"のようなエラーを与えます。私はaddHuman()にどのような引数を入れてスマートなポインタを使うのでしょうか?

+0

コピーコンストラクタはありますか?とにかく、HouseはなぜhumanPメンバーを定義しているのですか?それは何を表していますか? – user2357112

+3

おそらく 'new'を使わないでください。 'std :: vector humans'を' House'クラスに入れると、デフォルトのコピーコンストラクタでコピーされます。 [この宿題ですか](http://meta.stackoverflow.com/questions/334822/how-do-i-ask-and-answer-homework-questions)? – wally

+0

深いコピーを試みるいくつかのコードを投稿すると、助けがより簡単になります。 – wally

答えて

2

ディープコピーとは、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は、新しいメソッドを持っている

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

、このようなものになりますAddHuman():ベクトルで

void House:AddHuman(Person& newHuman); 

HumanHouse場合はオブジェクトを、Humanオブジェクトは自明コピーすることができます。

m_Humans.PushBack(newHuman); 
+0

だから、基本的には、私は別のヒューマンタイプのポインタを作成し、ちょうどポインタ1 =ポインタ2を作成したそのメソッドの中に人間のタイプのポインタを取得するハウスクラスの追加メソッドを記述する必要がありますか?コンストラクタで同じことをすることはできますか? newPersonを渡した後で削除することはできますか? – Johnie78

+1

@ Johnie78 pointer1 = pointer2は浅いコピーになります。私は深いコピーの必要性に対処するために私の答えにもっと多くを加えました。 –

+0

ありがとう!それは今やもっと明確です。ええ、私はそれが浅いコピーであることを見て、両方が同じものを指して、メインのものを削除することができなかったことを参照してください。 – Johnie78

関連する問題