Легкие 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
while (!myVector.empty())
{
((DerivedClass*)(myVector.back()))->Shutdown();
myVector.pop_back();
}
Примечания:
dynamic_cast
вместо жесткого приведения. (Если вы уверены, что в векторе есть только объекты DerivedClass
, почему это не std :: vector
?) Shutdown ()
должен быть объявлен в базовом классе. Shutdown ()
(и, вероятно, delete
). Редактировать: Использование std :: vector
, , как показано markh44 , вероятно, лучше, чем pop_back ()
.
Не могли бы вы сделать Shutdown виртуальной функцией в BaseClass? Тогда вам не понадобится приведение.
Также у вас, вероятно, возникнут проблемы с удалением элементов из вектора во время итерации. Я бы сделал это так:
vector<BaseClass*>::iterator iter;
for (iter = myVector.rbegin(); iter != myVector.rend(); iter++)
{
(*iter)->Shutdown();
}
myVector.clear();
Edit: и еще кое-что, ++ iter обычно предпочтительнее iter ++.
Приведение конструктора не работает для указателей. Используйте static_cast, если уверены, или dynamic_cast и проверьте.
Если 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 () не удалит объект из себя (что обычно является плохой идеей) или вы сохраняете повторяющиеся указатели и удаляете их где-то еще, что является еще одной рискованной идеей.