我仍然无法传递对Vector的引用

时间:2010-08-23 18:56:02

标签: c++ stdvector

我在this发帖中问了一个类似的问题,并从答复中学到了,但是

我仍然无法让它发挥作用。

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 =新词典”

错误是:

“no operator”=“匹配这些操作数。

我想要做的是每当新树

时创建一个新的Node * s向量

实例化。将对新向量(tree_dict)的引用传递给Node

构造函数,它将该引用传递给Node的每个新实例

(Node * left和Node * right)可以在

之前将指针推送回自己

将引用传递给子节点。

因此每个Tree.tree_dict都是一个包含指向

中每个Node *的指针的单个向量 树。我需要一些帮助。

4 个答案:

答案 0 :(得分:2)

tree_dict = new Dictionary;

说“在堆上分配一个新的Dictionary对象,并在tree_dict”中存储指向它的指针。不幸的是,tree_dict不是指针。

tree_dict = Dictionary();

这表示“创建一个新的Dictionary对象,并将其复制到tree_dict。”

答案 1 :(得分:2)

神圣的地狱你的代码有很多错误。你可能应该阅读一本乞讨的C ++书来学习基础知识,因为即使你的代码是可编译的,它的实现也非常糟糕。我必须指出的是,似乎没有人提到的是

std::vector<Node*>& node_dict;

的声明

您不能声明这样的引用。引用HAS是一个赋值。您说node_dict是对std::vector<Node*>对象的引用,但没有告诉它它引用了什么。如果这个编译然后你的编译器拉出&amp;符号而不是像ti那样抛出错误。

至于代码的不足,为什么甚至将node_dict声明为类变量?您在构造函数中为其赋值,但不要在构造函数之外使用它。它没有理由成为类变量。

答案 2 :(得分:0)

如果您在C ++中使用新类型,则会获得指向堆分配对象的指针。如果要在适当的位置分配它,请编写不带new关键字的构造函数。

答案 3 :(得分: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)) {} // ... }; 自动删除它,并帮助您的代码保护安全:

tree_dict

vector同样适用于{{1}},例如{{1}}。提升或TR1 smart pointers或类似Boosts shared_ptr