1

こんにちは、C++ で void ポインターを学習し始めたばかりで、現在、各ノードに格納されている値が値への void ポインターであるバイナリ ツリーを作成しています。

struct TreeNode
{
    int count;
    void* data;
    TreeNode *left;
    TreeNode *right;
    };

問題は、最初のメソッド追加メソッドで発生しました。私のメソッドは int aa パラメーターを受け取り、何も返さないようになりました。最初に、新しいノードを作成します。そのためには、整数を void にキャストする必要があります。プログラムがコンパイルされ、最初の要素がルートに正しく追加されますが、別の番号をメソッドに送信すると、ルートに再度格納されます。したがって、メインに tree.addToTree(12); のようなものがある場合 tree.addToTree(13); 最初に 12 を保存するよりも、else ステートメントの直後 (以下のコード) ルート -> データ i 13 よりも.

void Tree::addToTree(int num)
{
    if(root==NULL){
        root= new TreeNode();
        root->data=#
        //((int *)(root->data)) = num;//i tried to convert to void* in this way but it give me segmentation fault
        root->left=NULL;
        root->right=NULL;
    }
    else{
        //here root value is already changed
        int *intPtr = static_cast<int*>(root->data);
        cout << "key2" << *intPtrT << endl;
        //TreeNode* current= insert(num,root);
    }
}

私が理解したように、私は &num を使用しているため、パラメーターは常に 1 か所で引き裂かれ、ルートは &num に「接続」され、それも変化します。

解決策を見つけようとしましたが、うまくいきませんでした。int を void ポインタにする方法はありますか?

4

3 に答える 3

1

まず、データを値で格納するか、データへのポインタで格納するかを決定する必要があります。

最初のケースでは、ポインタを持つことは役に立たないので、次のようなテンプレートを使用できます:

template <typename T>
struct TreeNode
{
  T data;
  ..
}

TreeNode<int> node;

これはポインタ( などT *data ... data = new int())でも機能します。

データへのポインターを格納する場合は、型パラメーターを持つテンプレートを使用するか、共通の祖先クラスを使用してから、必要な型でサブクラス化することもできます。

class TreeData {

}

class TreeDataInt {
  int value;
}    

struct TreeNode
{
  TreeData *data;
  ..
}

最後intに、ポインター内でストーリーを作成するvoid*ことはあまり推奨void*されません。C++ を使用してポリモーフィズムを実現することは、一般的にお勧めできません。より安全で信頼性の高いツールが他にもたくさんあるためです。

int本当にa を a の中に格納したい場合は、ポインターに変換可能な整数型をvoid*使用する必要があります。intptr_t例えば:

#include <cstdint>

intptr_t value = 50;
node->data = static_cast<void*>(value);
intptr_t value2 = static_cast<intptr_t>(node->data);

これにより、整数の値が 内のアドレスとして直接保存されますvoid*。これは、ポインター自体を逆参照できないことを意味します。

ちなみに、スコープを出ると無効になる自動割り当て変数のアドレスにroot->data=&num割り当てているため、間違っています。data

于 2013-11-06T17:40:02.263 に答える