Векторный кастинг итераторов

Легкие nad Безопасные Шаги

Шаг 1: шаг 2 NVM

brew install nvm

Установки: Создайте каталог для шага 3 NVM

mkdir ~/.nvm/

: Настройте свои переменные окружения

nano ~/.bash_profile

ВСТАВКА НИЖЕ КОДА

export NVM_DIR=~/.nvm
source $(brew --prefix nvm)/nvm.sh

source ~/.bash_profile

Шаг 4: Проверьте свою работу дважды

nvm ls

Шаг 5: Узел Установки

nvm install 9.x.x

Step6: Обновление

nvm ls-remote

   v10.16.2   (LTS: Dubnium)
   v10.16.3   (Latest LTS: Dubnium) ..........

nvm устанавливает v10.16.3

, Диагностирующий

Error Example #1
rm -rf /usr/local/lib/node_modules
brew uninstall node
brew install node --without-npm
echo prefix=~/.npm-packages >> ~/.npmrc
curl -L https://www.npmjs.com/install.sh | sh

https://www.chrisjmendez.com/2018/02/07/install /

5
задан akif 3 September 2009 в 09:39
поделиться

4 ответа

while (!myVector.empty())
{
  ((DerivedClass*)(myVector.back()))->Shutdown();
  myVector.pop_back();
}

Примечания:

  • Вам, вероятно, следует использовать dynamic_cast вместо жесткого приведения. (Если вы уверены, что в векторе есть только объекты DerivedClass , почему это не std :: vector ?)
  • Вероятно, вам не нужно приводить вообще, поскольку Shutdown () должен быть объявлен в базовом классе.
  • Вам, вероятно, также следует удалить объекты перед тем, как вывести их из вектора. (Но это может быть не так.)
  • Вам, вероятно, следует использовать интеллектуальный указатель, который вызывает Shutdown () (и, вероятно, delete ).

Редактировать: Использование std :: vector :: clear () , , как показано markh44 , вероятно, лучше, чем pop_back () .

13
ответ дан 18 December 2019 в 11:59
поделиться

Не могли бы вы сделать Shutdown виртуальной функцией в BaseClass? Тогда вам не понадобится приведение.

Также у вас, вероятно, возникнут проблемы с удалением элементов из вектора во время итерации. Я бы сделал это так:

vector<BaseClass*>::iterator iter;

for (iter = myVector.rbegin(); iter != myVector.rend(); iter++)
{
    (*iter)->Shutdown();
}
myVector.clear();

Edit: и еще кое-что, ++ iter обычно предпочтительнее iter ++.

2
ответ дан 18 December 2019 в 11:59
поделиться

Приведение конструктора не работает для указателей. Используйте static_cast, если уверены, или dynamic_cast и проверьте.

1
ответ дан 18 December 2019 в 11:59
поделиться

Если Shutdown () является виртуальным методом базового класса, то есть BaseClass :: ShutDown (), вы должны напрямую вызвать iter-> ShutDown ();

В противном случае, если метод не виртуальный, вы должны использовать dynamic_cast .

vector<ADlgcDev*>::iterator iter;

for (iter = myVector.rbegin(); iter != myVector.end(); iter++)
{
 DerivedClassA* a = dynamic_cast<DerivedClassA*>( *iter ) ;
 if ( a ) a->ShutDownA();
 else
 {
 DerivedClassB* b = dynamic_cast<DerivedClassB*>(*iter);
 if ( b ) b->ShutDownB();
 // ... repeat for every class in hierarchy that might be in the vector.
 }
 myVector.pop_back();
}

В любом случае вы, вероятно, утекаете память, если ShutDown () не удалит объект из себя (что обычно является плохой идеей) или вы сохраняете повторяющиеся указатели и удаляете их где-то еще, что является еще одной рискованной идеей.

-1
ответ дан 18 December 2019 в 11:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: