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

この演習でHashNode、 単一のファイルですべてを宣言したいのですが、どのファイルを最初に宣言する必要がありますかNodeHash

Hash両方を前方宣言し、Nodeどちらかを最初に定義しようとしましたが、コンパイルされたものはありませんでした。

PS: これは宿題ではありません。グラフ アルゴリズムのパズルをオンラインで解こうとしています。

4

2 に答える 2

2

Hash::operator()定義後まで定義を遅らせ、前にNode宣言します。何もしない限り、不完全な型への参照を持つことができます。NodeHash

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は不十分です。が完全な型unordered_setであるとNode想定Nodeされているため、順序がどうであれ、コンパイルすることはできません。つまり、型を完全に定義する必要があります。

の定義を分割することに加えて、 の最初の型パラメーターをポインター (できればスマート ポインター)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 に答える