0

この投稿で同様の質問をし、回答から学びましたが、

私はまだそれを機能させることができません。

test_vector.h

    #include <vector>
    class Node
    {
    public:
     std::vector<Node*>& node_dict;
     int depth;
     char* cargo;
     Node* left;
     Node* right;
     Node( int a_depth, std::vector<Node*>& a_dict);
     ~Node();
    };

    class Tree
    {
    public:
     std::vector<Node*>tree_dict;
     Node* root;
     Tree();
     Tree(const Tree &original);
    };

test_vector.cpp

    #include "test_vector.h"

    using namespace std;
    typedef std::vector<Node*>Dictionary;//This seems like a good idea.
    typedef std::vector<Tree*>Population;
    Population pop;
    int Tree_depth = 3;

    Node::Node( int a_depth, std::vector<Node*>&a_dict):node_dict(a_dict), depth(a_depth)
    {
     if (depth <= 0)
     {
      cargo = "leaf_Node";
      left = 0;
      right = 0;
      node_dict.push_back(this);
      return;
     }
     else;
     {
      cargo = "Tree_Node";
      node_dict.push_back(this);
      depth--;
      left = new Node(depth, node_dict);
      right = new Node(depth, node_dict);  
     }
     return;
    };
    Node::~Node()
    {
     delete left;
     delete right;
    };

    Tree::Tree():tree_dict(NULL)
    {
     ****tree_dict = new Dictionary;****
     root = new Node(Tree_depth, tree_dict);
    };
    //copy constructor
    Tree::Tree(const Tree &original):tree_dict(NULL) 
    {
     root = NULL;
    root = new Node (*(original.root));
    };


    int main()
    {
     for (int i = 0;i <= 3; i++)
     {
     pop.push_back(new Tree());
     }
     return 0;
    }

アスタリスクのある行は機能しません。「tree_dict = 新しい辞書」

エラーは次のとおりです。

「演算子なし」= は、これらのオペランドに一致します。

私がやろうとしているのは、新しいツリーが存在するたびにノード*の新しいベクトルを作成することです

インスタンス化されます。ノードに新しいベクトル (tree_dict) への参照を渡します

Node の新しいインスタンスごとにその参照を渡すコンストラクター

(Node* left および Node* right) 前に自分自身へのポインターを push_back できます

参照を子ノードに渡します。

したがって、各 Tree.tree_dict は、各 Node* へのポインターを含む単一のベクトルです。

木。助けが必要です。

4

4 に答える 4

2

なんてこった、あなたのコードには多くの間違いがあります。コードがコンパイル可能であったとしても、実装が非常に不十分であるため、基本を学ぶために物乞いのC++本を読む必要があります。誰も言及していないように思われることを指摘しなければならないのは、

の宣言std::vector<Node*>& node_dict;

そのような参照を宣言することはできません。参照は割り当てである必要があります。あなたが言っているのはオブジェクトnode_dictへの参照ですが、それが何を参照しているのかを伝えていません。std::vector<Node*>これがコンパイルされると、コンパイラはtiのようにエラーをスローするのではなく、&記号を引き出します。

コードの貧弱さに関しては、なぜnode_dictをクラス変数として宣言しているのですか?コンストラクターで値を割り当てますが、コンストラクターの外部では使用しないでください。それがクラス変数であるべき理由はありません。

于 2010-08-23T21:15:58.547 に答える
2
tree_dict = new Dictionary;

それは、「ヒープに新しい Dictionary オブジェクトを割り当て、それへのポインターを格納するtree_dict」ということです。残念ながら、tree_dictポインタではありません。

tree_dict = Dictionary();

これは、「新しい Dictionary オブジェクトを作成し、それを にコピーするtree_dict」ことを示しています。

于 2010-08-23T19:01:36.083 に答える
0

それは単に次のようにする必要があります。

Tree::Tree() : tree_dict() // you can also omit the explicit initialization
{
    // no assignment to tree_dict needed, its already initialized
    root = new Node(Tree_depth, tree_dict);
};

tree_dictはポインターではありませんvector。値を格納しています。

投稿されたように、メモリを削除するデストラクタがないためroot、少なくともメモリをリークしていることに注意してください。または、自動的に削除してコードを例外セーフにするのに役立つスマート ポインターTree使用することもできます。std::auto_ptr

class Tree {
public:
    std::vector<Node*> tree_dict;
    std::auto_ptr<Node> root;
    Tree() : tree_dict(), root(new Node(Tree_depth, tree_dict)) {}
    // ...
};

Boosts または TR1または Boosts のようなものtree_dictとして、どちらがより適しているかについても同じことが言えます。vectorshared_ptrptr_vector

于 2010-08-23T19:03:49.690 に答える
0

C++ で新しい型を作成すると、ヒープに割り当てられたオブジェクトへのポインターが取得されます。その場で割り当てたい場合は、コンストラクターを new キーワードなしで記述します。

于 2010-08-23T18:59:12.003 に答える