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

错误是:

"no operator "=" 匹配这些操作数。

我想做的是每当有新树时创建一个新的 Node*s 向量

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

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

(Node* left and Node* right) 可以 push_back 一个指向自己的指针之前

将引用传递给他们的子节点。

所以每个 Tree.tree_dict 都是一个向量,其中包含指向每个 Node* 的指针

那个树。我需要一些帮助。

4

4 回答 4

2
tree_dict = new Dictionary;

那就是“在堆上分配一个新的 Dictionary 对象,并将指向它的指针存储在tree_dict”中。可惜tree_dict不是指针。

tree_dict = Dictionary();

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

于 2010-08-23T19:01:36.083 回答
2

天哪,你的代码有很多问题。您可能应该通过一本乞求的 C++ 书籍来学习基础知识,因为即使您的代码是可编译的,它的实现也非常糟糕。我必须指出的一件事似乎没有人提到是

的声明std::vector<Node*>& node_dict;

你不能声明这样的引用。参考必须是分配。你说node_dict的是对 aastd::vector<Node*>对象的引用,但没有告诉它它引用的是什么。如果编译成功,那么您的编译器将取出 & 符号,而不是像 ti 那样抛出错误。

至于你的代码的糟糕之处,你为什么还要将 node_dict 声明为类变量?您在构造函数中为其分配一个值,但不要在构造函数之外使用它。没有理由它应该是一个类变量。

于 2010-08-23T21:15:58.547 回答
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 回答