以下のクラスを作りました。 class MyClass { public: int data; list<MyClass*> children; }; MyClass* root; // インスタンスは生成済みとします このrootの階層全体をコピーしたいのですが、個別(コピー先)に必要なのはdataの値のみなので、階層情報は1つのインスタンスを共有すれば良いと思いました。 (階層は変更されないです) どうしたらいいでしょうか?
ログインして回答する
lkkkk
http://ray.sakura.ne.jp/tips/copy.html
こんな感じで実装する
いるか賞に選定してください。よろしくお願いします。Ko8820さんのは、すごくいいと思います。
?
これ以上回答リクエストを送信することはできません。制限について
コメント(8件)
1.ツリー構造のデータを構築後に、データ、および、階層は変更あるか?
2.1で変更がある場合はそれらをコピー先で反映する必要があるか?
あたりを、まずは教えて頂けますか?
もし、データ、階層、ともに変更がないのであれば、コピーを作る必要がそもそもないと思います。
また、仮に変更があっても、コピー先も反映したいのであれば、コピーを作ってはいけないと思います。
つまり、これらの場合は、元オブジェクトを共有すべきでしょう。
ちなみに、同じプロセス空間内ですよね?
>1.ツリー構造のデータを構築後に、データ、および、階層は変更あるか?
階層(親子関係)の変更はありません。データは変更されます。
>2.1で変更がある場合はそれらをコピー先で反映する必要があるか?
反映するデータとそうでないデータ(コピー先によって個別に変更されるデータ)があります。
>同じプロセス空間内ですよね?
はい。
ko8820さん、tdoiさん、ごめんなさい。
階層の変更がなく、データの変更があるということですが、これはコピー元、および、コピー先で、その変更も共有しますか?それとも、コピー元の変更はコピー先でも反映する必要があるが、コピー先の変更は独自に管理したいというようなことはありますか?
これがなければ、オブジェクト自体を共有して、コピーをしないという選択肢が、パフォーマンスや、同期処理なんかを考えてもいいと思うのですが、コピーする意図は何かありますか?
>>コピー先の変更は独自に管理したいというようなことはありますか?
あります。
>>コピーする意図は何かありますか?
質問したプログラムは実際何かというとゲームに使うキャラクタのクラスでして、頂点情報やボーン階層は共有したいけれど、
個別にアニメーション(各ボーンが保持している行列が変更される)したいのです。
頂点情報が何を意味するか分かりませんが、コピーを作成して、それらを独自に動かしたいのであれば、クローンメソッド的なものを作成するしかないんじゃないでしょうか?再帰的にコピーすれば済むことですからね。
ただ、ひょっとすると、クラス設計などは一度見直してもいいかもしれませんね。
コメントありがとうございました。