Класс с вектором структуры, который содержит тот же класс - PullRequest
1 голос
/ 20 января 2012

У меня есть класс Node и структура Edge. Но когда структура пишется перед классом, структура жалуется, что не знает, что такое расстояние. То же самое и в случае, когда структура определена после, классы жалуются, что не знают, что такое Edge (тип вектора).

//This is my header file

typedef struct Edge Edge;
struct Edge{

   Node node;
   int distance;

};

class Node
{

  private:

  std::vector<Edge> vectorOfEdges;

};

Как мне обойти эту ошибку? Спасибо.

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Нет способа обойти это, если вы буквально хотите сохранить код таким, какой он есть: что касается стандарта, то std::vector<T> может буквально содержать элементы типа T, и, таким образом, у вас есть циклический взаимная зависимость, при которой Edge содержит Node, а Node содержит Edge, что не имеет смысла.

(Фактическая формулировка заключается в том, что создание экземпляра шаблона контейнера стандартной библиотеки для неполного типа является неопределенным поведением.)

Типичным способом решения этой проблемы является идиома PIMPL, при которой вы предоставляете только указатель на элемент:

struct Edge;

class Node
{
    std::unique_ptr<std::vector<Edge>> pVecImpl;
public:
    Node() : pVecImpl(::new std::vector<Edge>) { }
    // ...
};

struct Edge
{
    // as before
};

Herb Sutter's GotW # 101 описывает изящное решение для абстрагирования этого шаблона чистым и привлекательным способом.

(В качестве альтернативы вы также можете сделать Edge::node указателем.)

1 голос
/ 20 января 2012

Ваше определение круглое: оно пытается поместить Node внутри Edge, а вектор ребер внутри Node. Вам нужно сделать один из этих указателей, например, так:

class Node;
struct Edge{
    Node *node;
    int distance;
};
class Node {
private:
    std::vector<Edge> vectorOfEdges;
};

P.S. Вы пропустили точку с запятой после структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...