C++;使用邻接列表表示的循环依赖混淆 对不起,我对C++缺乏经验,但我花了一些时间来解决循环依赖问题,因此提出了这个问题。 我试图用C++表示邻接表。

C++;使用邻接列表表示的循环依赖混淆 对不起,我对C++缺乏经验,但我花了一些时间来解决循环依赖问题,因此提出了这个问题。 我试图用C++表示邻接表。,c++,adjacency-list,cyclic-reference,C++,Adjacency List,Cyclic Reference,我有struct节点 struct Node{ int data; unordered_set<Node, Hash> links; bool operator == (Node const& other) const{ return (data == other.data); } Node(){ } Node(int data){ this->data = data;

我有struct
节点

struct Node{

    int data;
    unordered_set<Node, Hash> links;

    bool operator == (Node const& other) const{
        return (data == other.data);
    }

    Node(){
    }

    Node(int data){
        this->data = data;
    }
};
我注意到
Hash
使用
Node
Node
使用
Hash

如果出于本练习的目的,我想在单个文件中声明所有内容,那么我应该首先声明哪个文件

我尝试了向前声明
散列
节点
,并首先定义它们中的任何一个,但没有编译它们


PS:这不是家庭作业,我正在尝试在线解决图形算法难题

延迟定义
Hash::operator()
直到定义
节点之后
并在
Hash
之前声明
节点。只要不做任何操作,就可以引用不完整的类型

class Node;

class Hash{
    public:
        size_t operator()(const Node &node) const;
};

class Node{
    public:
        int data;
        unordered_set<Node, Hash> links;
};

inline size_t Hash::operator()(const Node &node) const{
    return node.data;
}
类节点;
类散列{
公众:
size_t操作符()(const Node&Node)const;
};
类节点{
公众:
int数据;
无序设置链接;
};
内联大小\u t哈希::运算符()(常量节点和节点)常量{
返回node.data;
}

通过将哈希实现移动到
节点
完全定义后的某个点来解析语法是不够的。无论顺序如何,您都无法编译它,因为
节点
无序集
期望
节点
是一个完整的类型,即需要完全定义该类型

除了拆分
Hash::operator()
的定义外,还需要将
unordered\u集的第一个类型参数更改为指针,最好是智能指针:

unordered_set<shared_ptr<Node>, Hash> links;
...
size_t Hash::operator()(const shared_ptr<Node> &node) const{
    return node->data;
}
无序设置链接;
...
大小\u t哈希::运算符()(常量共享\u ptr和节点)常量{
返回节点->数据;
}

常规指针也可以工作,但是您必须单独管理节点的内存-例如,将所有节点放置在一个向量中。

您可以使用向量来存储邻接列表。将更容易有趣的是,g++4.9/g++5不编译,抱怨
Node
是一个不完整的类型,但是clang++编译代码。@vsoftco我想我看到了一个关于这个差异的问题,并试图找出这两个编译器中哪一个是正确的,但我似乎找不到它,我不记得答案是什么了。@dasblinkenlight上面的代码似乎是UB,我只是问了一个问题@vsoftco似乎提出了不同的建议。@CoffeeandCode我认为这个问题在C++11标准中得到了澄清,但不确定C++03。
unordered_set<shared_ptr<Node>, Hash> links;
...
size_t Hash::operator()(const shared_ptr<Node> &node) const{
    return node->data;
}