<list> проблема с извлечением элементов с помощью итератора - PullRequest
1 голос
/ 15 ноября 2009

У меня есть список типа Инструкция *. Инструкция это класс, который я сделал. В этом классе есть функция execute ().

Я создаю список инструкций *

list<Instruction*> instList;

Я создаю инструкцию *

Instruction* instPtr;
instPtr = new Instruction("test",10);

Если я позвоню

instPtr.execute();

функция будет выполнена правильно, однако, если я сохраню instPtr в instList, я больше не смогу вызвать функцию execute () из списка.

//add to list
instList.push_back(instPtr);

//create iterator for list
list<Instruction*>::iterator p = instList.begin();
//now p should be the first element in the list
//if I try to call execute() function it will not work
p -> execute();

Я получаю следующую ошибку:

error: request for member ‘execute’ in ‘* p.std::_List_iterator<_Tp>::operator-> [with _Tp = Instruction*]()’, which is of non-class type ‘Instruction*’

Ответы [ 4 ]

9 голосов
/ 15 ноября 2009

p - это итератор Instruction * указателей. Вы можете думать об этом как о типе Instruction **. Вам нужно удвоить разыменование p примерно так:

(*p)->execute();

*p будет иметь значение Instruction *, а дальнейшее применение оператора -> для этого разыменует указатель.

4 голосов
/ 15 ноября 2009

попробуй (*p)->execute();

1 голос
/ 15 ноября 2009

Вместо p-> execute () вам нужно (* p) -> execute ();

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

0 голосов
/ 15 ноября 2009

Лучшее решение - сохранить boost :: shared_ptr в вашем списке. Запомните все контейнеры STL, работающие по принципу копирования.

Используйте этот код

list> instList;

затем вызовите вашу функцию execute как обычно

instList [я] -> Execute ();

как вы можете видеть, вы вызываете execute, так как вы сохраняете указатели в вашем списке. это лучшее решение

...