C++でツリー構造を持ったクラスの設計方法について。

以下のクラスを作りました。
class MyClass {
public:
int data;
list<MyClass*> children;
};
MyClass* root; // インスタンスは生成済みとします
このrootの階層全体をコピーしたいのですが、個別(コピー先)に必要なのはdataの値のみなので、階層情報は1つのインスタンスを共有すれば良いと思いました。
(階層は変更されないです)

どうしたらいいでしょうか?

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2010/04/05 17:13:19
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:INAIRU No.1

回答回数2ベストアンサー獲得回数0

lkkkk

id:ko8820 No.2

回答回数1221ベストアンサー獲得回数69

http://ray.sakura.ne.jp/tips/copy.html

こんな感じで実装する

id:ta90-31 No.3

回答回数31ベストアンサー獲得回数0

いるか賞に選定してください。よろしくお願いします。Ko8820さんのは、すごくいいと思います。

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 donarubo 6 0 0 2010-04-05 17:08:08
  • id:tdoi
    求める処理次第だと思いますが、コピーによって何を行いたいですか?

    1.ツリー構造のデータを構築後に、データ、および、階層は変更あるか?
    2.1で変更がある場合はそれらをコピー先で反映する必要があるか?

    あたりを、まずは教えて頂けますか?
    もし、データ、階層、ともに変更がないのであれば、コピーを作る必要がそもそもないと思います。
    また、仮に変更があっても、コピー先も反映したいのであれば、コピーを作ってはいけないと思います。
    つまり、これらの場合は、元オブジェクトを共有すべきでしょう。

    ちなみに、同じプロセス空間内ですよね?
  • id:mijusawa
    コメントありがとうございます。

    >1.ツリー構造のデータを構築後に、データ、および、階層は変更あるか?
    階層(親子関係)の変更はありません。データは変更されます。

    >2.1で変更がある場合はそれらをコピー先で反映する必要があるか?
    反映するデータとそうでないデータ(コピー先によって個別に変更されるデータ)があります。

    >同じプロセス空間内ですよね?
    はい。
  • id:mijusawa
    ちょっとひどいんでキャンセルしました。
    ko8820さん、tdoiさん、ごめんなさい。
  • id:tdoi
    ちょっとひどい回答が多すぎでしたね。

    階層の変更がなく、データの変更があるということですが、これはコピー元、および、コピー先で、その変更も共有しますか?それとも、コピー元の変更はコピー先でも反映する必要があるが、コピー先の変更は独自に管理したいというようなことはありますか?

    これがなければ、オブジェクト自体を共有して、コピーをしないという選択肢が、パフォーマンスや、同期処理なんかを考えてもいいと思うのですが、コピーする意図は何かありますか?
  • id:mijusawa
    >>これはコピー元、および、コピー先で、その変更も共有しますか?
    >>コピー先の変更は独自に管理したいというようなことはありますか?
    あります。

    >>コピーする意図は何かありますか?
    質問したプログラムは実際何かというとゲームに使うキャラクタのクラスでして、頂点情報やボーン階層は共有したいけれど、
    個別にアニメーション(各ボーンが保持している行列が変更される)したいのです。
  • id:tdoi
    なるほど。

    頂点情報が何を意味するか分かりませんが、コピーを作成して、それらを独自に動かしたいのであれば、クローンメソッド的なものを作成するしかないんじゃないでしょうか?再帰的にコピーすれば済むことですからね。

    ただ、ひょっとすると、クラス設計などは一度見直してもいいかもしれませんね。
  • id:mijusawa
    やっぱり設計がまずいんですかね。。。ちょっと見直してみます。
    コメントありがとうございました。
  • id:tdoi
    まずいかどうかは、その他の事情によるので判断できませんが、構造(メモリ配置)が同じなら、単一のオブジェクトとして表現してしまうのもありだと思いますし、普通にコピーすることの問題がどこにあるのかが分からないと何とも言えないですけどね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません