0


0

まだベクターへの参照を渡すのに問題があります

私はhttps://stackoverflow.com/questions/3434534/how-do-i-code-and-pass-a-reference-to-a-stdvector[this]の投稿で同様の質問をし、返信から学びましたが、

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

test_vector.h

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

    class Tree
    {
    public:
     std::vectortree_dict;
     Node* root;
     Tree();
     Tree(const Tree &original);
    };

test_vector.cpp

    #include "test_vector.h"

    using namespace std;
    typedef std::vectorDictionary;//This seems like a good idea.
    typedef std::vectorPopulation;
    Population pop;
    int Tree_depth = 3;

    Node::Node( int a_depth, std::vector&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)これは、以前に自分自身へのポインターをプッシュバックできます

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

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

ツリー。 助けが必要です。

4 Answer


2


tree_dict = new Dictionary;

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

tree_dict = Dictionary();

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


2


神聖な地獄コードには多くの間違いがあります。 コードをコンパイルできたとしても、実装が非常に不十分であるため、基本的なことを学ぶためにC ++の物beいの本を読んでください。 誰も言及していないように私が指摘しなければならない一つのことは

`std

vector&node_dict;`の宣言

そのような参照を宣言することはできません。 参照は割り当てである必要があります。 node_dict`は std

vector`オブジェクトへの参照であると言っていますが、それが何を参照しているのかは伝えていません。 これがコンパイルされる場合、コンパイラはtiのようにエラーをスローする代わりに&シンボルを引き出しています。

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


0


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


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`を保存しています。

投稿されたように、「ツリー」にはそれを削除するデストラクタがないため、少なくとも「ルート」のメモリをリークしていることに注意してください。 または、 `std

auto_ptr`のようなhttp://en.wikipedia.org/wiki/Smart_pointer [スマートポインター]を使用して、自動的に削除し、コードを例外セーフにすることができます。

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

同じことは、 tree_dict`にも当てはまります。 BoostsまたはTR1 http://www.boost.org/doc/libs/1_44_0/libs/smart_ptr/shared_ptr.htm [`shared_ptr]またはBoosts http://www.boost.org/doc/libs/1_44_0のようなもの/libs/ptr_container/doc/ptr_vector.html [ptr_vector]。