Ваша первая проблема заключается в следующем:
void m_CreateModes() {
if (!pMode1() == NULL) { Modes()->push_back(pMode1()); }
if (!pMode2() == NULL) { Modes()->push_back(pMode2()); }
if (!pMode3() == NULL) { Modes()->push_back(pMode3()); }
if (!pMode4() == NULL) { Modes()->push_back(pMode4()); }
if (!pMode5() == NULL) { Modes()->push_back(pMode5()); }
}
Как уже упоминалось в комментариях, Modes () каждый раз возвращает новый список, но результат из puch_back недоступен после следующего '}'
Я просто буду использовать C ++ 11 для удаления некоторых более утомительных аспектов кода.
using ModeList = list<Mode*>;
ModeList m_CreateModes() {
ModeList modes = Modes();
if (!pMode1() == NULL) { modes->push_back(pMode1()); }
if (!pMode2() == NULL) { modes->push_back(pMode2()); }
if (!pMode3() == NULL) { modes->push_back(pMode3()); }
if (!pMode4() == NULL) { modes->push_back(pMode4()); }
if (!pMode5() == NULL) { modes->push_back(pMode5()); }
return modes;
}
Теперь режимы работают до выхода из функции и возвращаются, вызывающая сторона должна теперь сохранять возвращенныезначение или информация потеряна.В качестве альтернативы, если вы хотите использовать значения, возвращаемые режимы могут быть переменной-членом базового класса.
Другие проблемы, это может быть неправильно понято
if (!pMode1() == NULL) { modes->push_back(pMode1()); }
Допустим, pMode1 () возвращает NULL, тогда вы получаете, и NULL определяется как (0)
if (!NULL == NULL) { Modes()->push_back(pMode1()); }
if (true == 0) { Modes()->push_back(pMode1()); }
, и если он возвращает что-то не NULL
if (!0xdeadbeef == NULL) { Modes()->push_back(pMode1()); }
if (false == 0) { Modes()->push_back(pMode1()); }
Итак, что вы действительно хотели, замените NULL на nullptr (C++ 11)
if (!pMode1() == nullptr ) { modes->push_back(pMode1()); }
Теперь вы получаете предупреждение о том, что bool не является nullptr_t, и вы должны написать
if (!(pMode1() == nullptr) ) { modes->push_back(pMode1()); }
или
if (pMode1() != nullptr ) { modes->push_back(pMode1()); }
или даже
if (pMode1()) { modes->push_back(pMode1()); }
Другие примечания
m_ChooseModeFromList, вероятно, пропускает цикл.
многократное использование одного и того же кода с разностью только числа говорит мне, что это должен быть массивв некотором роде, std :: array или std :: vector.
использование необработанных указателей обычно неверно, но не всегда.
хорошая самостоятельная помощь - использование отладчика для перехода покод.