加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

持有泛型类型的实例 – C.

发布时间:2020-12-16 09:26:23 所属栏目:百科 来源:网络整理
导读:我有一个tree_node类和一个树类. templatetypename Tclass tree_node{public: tree_node(const std::string key_,const T value_) : key(key_),value(value_) { }private: T value; std::string key;};templatetypename Tclass tree{public: tree() : root(n
我有一个tree_node类和一个树类.

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,它可以正确地保存所有类型,包括指针类型.

编辑

在尝试了各种方法后,我发现boost :: optional在这种情况下很有用.我可以将T值设为boost :: optional< T>值.这将解决空构造函数问题.所以我可以使用tree_node的另一个构造函数重载,它只需要一个键.这可以由根节点使用.这是正确的方法吗?

谢谢..

解决方法

Init根值应该为零.如果你推新节点,你显然知道价值.

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; 
};

如果使用后缀树,则应该制作两种类型的顶点:

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; 
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读