1

很抱歉我对 C++ 缺乏经验,但我花了一些时间来解决循环依赖问题并因此提出这个问题。

我正在尝试用 C++ 表示邻接列表。

我有结构Node

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函子

struct Hash {
    size_t operator()(const Node &node) const {
        return node.data;
    };
};

我注意到Hash使用NodeNode使用Hash
If 出于本练习的目的,我想在一个文件中声明所有内容,我应该首先声明哪个文件。

我尝试对两者进行前向声明HashNode首先定义它们中的任何一个,但没有一个被编译。

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

4

2 回答 2

2

延迟定义Hash::operator()直到定义Node和声明Node之前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;
}
于 2015-03-07T03:01:46.337 回答
1

Node通过将 hash 的实现移动到完全定义后的某个点来解析语法是不够的。无论顺序是什么,您都无法编译它,因为期望unordered_set是一个完整的类型,即需要完全定义类型。NodeNode

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

unordered_set<shared_ptr<Node>, Hash> links;
...
size_t Hash::operator()(const shared_ptr<Node> &node) const{
    return node->data;
}

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

于 2015-03-07T03:09:23.980 回答