Как правильно делать круговые определения типов в 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;
};