Как правильно делать круговые определения типов в C++?

Я пытаюсь реализовать неориентированный граф, хранящий соседей в связанном списке. Поскольку be будет удалять края позже, мне также нужно сохранить итератор для противоположного края, чтобы обеспечить синхронизированное удаление.

Вот тут и появляется цикличность. По сути, я пытаюсь сделать что-то вроде:

typedef std::list<Edge> Node;
typedef std::pair<Node*,Node::iterator> Edge;

Очевидно, это не сработает. Могу ли я как-то злоупотреблять наследованием, чтобы вырваться из цикла? Будет ли это универсально работать на всех компиляторах?

struct Edge;
typedef std::list<Edge> Node;
struct Edge:public std::pair<Node*,Node::iterator>{using pair::pair;};

Кроме того, каков идиоматический способ C++ сделать это?

0 ответов

Да, вам нужно заранее объявить что-то, чтобы иметь круговую ссылку (Циркулярное включение все еще невозможно)

Более идиоматическим способом было бы дать членам Edge лучшие имена, чем first а также second,

struct Edge
{
    Node * destination;
    Node::iterator dual;
};
Другие вопросы по тегам