Как объект C ++ может иметь в качестве члена итератор на своей позиции в std :: list? - PullRequest
1 голос
/ 27 января 2011

У меня есть приложение, в котором есть узлы, которые подключены друг к другу. Каждый узел хранит список входящих и исходящих соединений с другими узлами. Время от времени принимающий узел должен иметь возможность избавиться от одного из входящих соединений. Когда это происходит, я хочу, чтобы соединение было удалено не только из списка входящих соединений принимающего узла, но и из списка исходящих соединений отправляющего узла. Но для этого принимающему узлу необходим итератор отправляющего узла для соединения. Было бы хорошо, если бы я мог просто сохранить этот итератор в качестве члена объекта соединения. Но попытка сделать это даже не скомпилируется. Когда я пытаюсь объявить итератор как член класса, компилятор говорит мне, что это неопределенный тип. Вот как выглядит объявление моего класса:

class Connection
{
   public:
   Connection();
   ~Connection();

   Node* pSourceNode;
   std::list<Connection*>::iterator SourcesIterator;
};

Есть ли какой-нибудь аккуратный способ заставить это или что-то подобное работать без необходимости писать свой собственный связанный список? Возможно, какая-то структура данных, которая до сих пор ускользала от меня?

Ответы [ 2 ]

0 голосов
/ 27 января 2011

Вы можете попробовать комбинацию объявлений typedef / forward, может лучше работать в VC6:

typedef class Connection* ConnectionPtr;
class Connection
{
   public:
   Connection();
   ~Connection();

   Node* pSourceNode;
   std::list<ConnectionPtr>::iterator SourcesIterator;
};
0 голосов
/ 27 января 2011

Я смог скомпилировать ваш код просто отлично.Вы делаете #include <list> в шапке?

Возможно, вы все равно не захотите держаться вокруг iterator;большое количество операций делает их недействительными.Вы можете оставить указатель на list и получить при необходимости новый iterator.

...