类T的成员是具有模板参数T的模板类的实例化

时间:2016-08-25 23:42:49

标签: c++

所以我正在为一些图形结构(后缀树)编写类,我遇到了这个困难的事情:一个节点应该有指针,一个指向它的父节点,还有一组指向其子节点的指针。我正在使用智能指针来避免内存错误,这就是问题:我写了

class node { 
    ...
    std::shared_ptr<node> parent; 
    ...
};

我猜这个东西有一个术语。像自我引用,或者其他什么。当我写这篇文章的时候,最初我有信心,会有一个错误,但没有成功编译。我很好奇,我能写出类似的东西:

class some_class_2{ 
    ...
    std::vector<some_class_2> some_vector; 
    std::string string_; 
    some_class() { 
        string_ = "lol";
        some_vector = std::vector<some_class>(10); 
    }
 };

看来这个问题的答案是肯定的。因此,当我启动已经成功编译的测试程序时,当然它不会停止,也许我等不够,它应该给我一些与内存相关的错误。

所以问题是,你应该如何处理c ++中的这类事情? c ++中允许的那些东西难道不奇怪吗?将std :: shatre_ptr放在some_class中是否正常?如何编写安全代码,避免some_class_2中的错误,以及最佳方法 代表图形结构?

1 个答案:

答案 0 :(得分:1)

如果语言不允许在node的定义中任何使用node,那么将无法创建链接数据结构,例如列表和树。为了使语言有用,它必须允许这样的结构:

struct node {
    int key;
    node* next;
};

另一方面,语言不允许这样:

struct node {
    int key;
    node next;
};

因为node对象将包含无限嵌套的node个对象序列并且无限大。

语言处理此方法的方法是仅允许类成员完整类型。已知完整类型的尺寸。在看到完整定义之前,类类型不完整。因此node在内部 是不完整的,因此您无法将node成员放在node对象中。但即使node*尚未完成,node也已完成。

某些标准库模板可以与完整类型一起使用。智能指针std::unique_ptr<T>std::shared_ptr<T>std::weak_ptr<T>被允许具有不完整的T,因为它们具有指针语义。但是,std::vector 允许其模板参数不完整,结果是未定义的行为。避免这种情况的方法是不要写(它并不那么难)。