我在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 *的指针的单个向量 树。我需要一些帮助。答案 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
。