←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.3753

C++でポインターの配列(BTreeeについて)
投稿者---kaz(2005/05/15 15:05:13)


またお世話になります。現在、iteratorを返すBtree(ひとつのノードに一つ以上の要素をもったもの)を作っているのですが、子ノードのデータ構造が決まりません。一つのノードが持つすべての子ノードのポインターを持ちたいのですが、アドレスを入れておく配列の作り方がわかりません。以下に簡略化したコードをのせます。

template <typename T>
class Node{
public:
    Node(int ItemNum){
        mParent = 0;
        mChildNodes = Node[ItemNum+1]; // 初期化の方法がわかりません。
    }
private:
     /** 親ノードのポインター */
     Node* mParent;

     /** このノードが持つ要素 */
     vector<T> mItems;

     /** 子ノードのポインターの配列 */
     Node* mChildNodes;                    // これができません。
};

上のプログラムが示しているようなイメージのポインターの配列をつくりたいのですが、初期化の方法が見つかりません。Node** なるのがいいのかと思っても見たのですが、同じように初期化の方法が見つかりません。また、もっといい方法があるのなら教えていただきたいのですが、どうかよろしくお願いします。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:C++でポインターの配列(BTreeeについて) 3754 Ban 2005/05/15 16:20:53


No.3754

Re:C++でポインターの配列(BTreeeについて)
投稿者---Ban(2005/05/15 16:20:53)


template <typename T>
class Node{
public:
    Node(int ItemNum){
        mParent = 0;
        mChildNodes.resize(ItemNum+1);
    }
private:
     /** 親ノードのポインター */
     Node* mParent;

     /** このノードが持つ要素 */
     vector<T> mItems;

     /** 子ノードのポインターの配列 */
     std::vector<Node*> mChildNodes;
};



こんな感じでしょうか。
配列で取ってしまうとサイズが確定してしまいますし、
配列のポインタを動的に生成するくらいなら vector が便利かと。



この投稿にコメントする

削除パスワード

No.3755

Re:C++でポインターの配列(BTreeeについて)
投稿者---kaz(2005/05/15 21:06:37)


BANさんありがとうございます。vector<Node*>でやってみようと思います。
もしよろしければポインターの配列の初期化方法も教えていただけたらうれしいです。どうしてもやりかたがわかりません。

Node** n;
n = new Node[5] のようにするようにおもえるんですが。。。

あと、デストラクタについて教えていただきたいのですが、
前スレッドで示したBTREEのノードクラスなんですが、4つのメンバ変数を持っています。

    int mMax;
    
    Node<T>* mParent;
    
    vector<Node*> mChildNodes;
    
    vector<T> mItems;


template<typename T>
Node<T>::Node<T>(int num){
    mMax = num;
    mChildNodes.resize(num+1);
    mParent = 0;
}

このmParentはポインターを格納するための変数であってこのNodeクラス内ではnewされることはありません、

が

template<typename T>
void Node<T>::connectChild(int childNum, Node<T>* child){
    mChildNodes[childNum] = child;
    if (child != NULL){
        child->mParent = this;
    }
}

このように自分自身のアドレスを子ノードの親としてセットしています。
ここで質問なんですが、このNodeクラスのデストラクタではなにがdeleteされるべきなんでしょうか? 

あと、細かいことなんですが、ヘッダーファイルでは

Node<T>* getParent() const;

と宣言するのと

Node* getParent() const;

どちらがただしいのでしょうか?どちらの場合もコンパイルはとおり、問題がないようなのですが、どちらが正しい方法なのでしょうか?
どうかよろしくお願いします。




この投稿にコメントする

削除パスワード

No.3756

Re:C++でポインターの配列(BTreeeについて)
投稿者---Ban(2005/05/15 23:14:08)


> Node** n;
> n = new Node[5] のようにするようにおもえるんですが。。。

「Node* の配列」が欲しいのですよね。
Node** n = new Node*[5];


> あと、デストラクタについて教えていただきたいのですが、
-- snip --
> このmParentはポインターを格納するための変数であってこのNode
> クラス内ではnewされることはありません、
-- snip --
> このように自分自身のアドレスを子ノードの親としてセットしています。
> ここで質問なんですが、このNodeクラスのデストラクタでは
> なにがdeleteされるべきなんでしょうか?

削除の責務を誰が持つかは設計次第なのですが、
・親が子を殺す
・子が自分で死ぬ
・生存管理用クラスを用意して任せる(ガベコレ含む)
・smart_ptr に任せる
・.......
原則としては「自分がnew で生成したもの」を delete すると思います。
new と delete, new[] と delete[] は必ず一対です。

Node* の配列を new したなら delete[] n; が必要でしょう。
vector なら自分で delete する必要がありません。

いずれの場合でも、その中身のポインタを new しているなら
その delete は必要で、単にポインタを格納するだけなら不要です。


> あと、細かいことなんですが、ヘッダーファイルでは

どちらでもいい気がするのですが。
・Node の宣言内なら Node だけでもアクセスできる。
・Node<T> と明示してもアクセスできる。



この投稿にコメントする

削除パスワード

No.3757

ありがとうございます。
投稿者---kaz(2005/05/16 07:36:28)


>「Node* の配列」が欲しいのですよね。
>
Node** n = new Node*[5];


謎が解けました…


>いずれの場合でも、その中身のポインタを new しているなら
>その delete は必要で、単にポインタを格納するだけなら不要です。

これを確認したかったのです。ありがとうございます。


>どちらでもいい気がするのですが。
>・Node の宣言内なら Node だけでもアクセスできる。
>・Node<T> と明示してもアクセスできる。

どっちでもいいんですね。すごく気になったもので。

いろいろと教えて頂いて感謝します。もしまた、何かあったらどうかよろしくお願いします。
ありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity