所以我正在为一些图形结构(后缀树)编写类,我遇到了这个困难的事情:一个节点应该有指针,一个指向它的父节点,还有一组指向其子节点的指针。我正在使用智能指针来避免内存错误,这就是问题:我写了
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中的错误,以及最佳方法 代表图形结构?
答案 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
不允许其模板参数不完整,结果是未定义的行为。避免这种情况的方法是不要写(它并不那么难)。