我有一个tree_node
类和一个tree
class.
template<typename T>
class tree_node
{
public:
tree_node(const std::string& key_, const T& value_)
: key(key_), value(value_)
{
}
private:
T value;
std::string key;
};
template<typename T>
class tree
{
public:
tree() : root(new tree_node<T>("", ???)) { }
private:
tree_node<T>* root;
};
tree_node
期望一个实例T
创建时。我怎样才能通过它???
地方?我可以说T()
,但只有当T
有一个无参数构造函数。我不能有一个无参数构造函数tree_node
因为它不会编译如果T
没有无参数构造函数。
我正在寻找一种设计方法tree_node
它可以正确保存所有类型,包括指针类型。
Edit
尝试了各种方法之后我发现boost::optional
在这种情况下很有帮助。我可以使T value
into boost::optional<T> value
。这将解决空构造函数问题。所以我可以有另一个构造函数重载tree_node
这只需要一个key
。这可以被根节点使用。这是正确的方法吗?
Thanks..
初始根值应为零。如果你推送新节点,你显然知道价值。
template<typename T>
class tree
{
public:
tree() : root(0) { }
void push (const std::string& key, const T & t) {
if (root == 0) {
root = new tree_node<T>(key, t);
} else {
// Make complex tree
}
}
private:
tree_node<T>* root;
};
Add
如果您使用后缀树,您应该创建两种类型的顶点:
enum NodeType { EMPTY_NODE, VALUE_NODE };
class base_tree_node
{
public:
base_tree_node() :parent(0), left(0), right(0) {}
virtual NodeType gettype() = 0;
protected:
base_tree_node* parent;
base_tree_node* left;
base_tree_node* right;
};
class empty_tree_node : base_tree_node
{
virtual NodeType gettype() { return EMPTY_NODE; }
}
template<typename T>
class tree_node : base_tree_node
{
public:
tree_node(const std::string& key_, const T& value_)
: key(key_), value(value_)
{
}
virtual NodeType gettype() { return VALUE_NODE; }
private:
T value;
std::string key;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)