Мне нужно кое-что объяснить, поэтому я буду стараться изо всех сил.У меня есть класс InstructionScreen, который отображает стрелки и блоки текста, которые объясняют, что делает каждая кнопка и т. Д. Поэтому в InstructionScreen у меня есть набор функций-членов, каждая из которых создаст несколько стрелок и текста, чтобы объяснить, что делает другая кнопка.
Экран InstructionScreen будет разделен на MenuInstructScreen, OptionsInstructScreen и т. Д., И в этих классах я создам пользовательские функции, которые будут создавать стрелки и текст для объяснения кнопок их экранов.
Проблема заключается в объявлении этого стека в InstructionScreen, потому что он будет содержать функции, которые являются частью их подкласса.Я думаю, что могу сделать это, но я использую шаблоны правильно?
Итак, проблема в двух словах: как мне объявить стек, который будет содержать функции-члены класса, который не 't еще существует?
Проблема намного легче понять и увидеть, если вы посмотрите на этот простой пример:
typedef class InstructionScreen;
typedef class MenuInstructScreen;
template <typename FooClass>
typedef void (FooClass::*MemberFuncPtr)(); // will be typedef void (MenuInstructScreen::*MemberFuncPtr)();
class InstructionScreen
{
public:
InstructionScreen() {}
void runInstructions()
{
while ( !instructionStep.empty() )
{
(this->*instructionStep.top())();
instructionStep.pop();
}
}
protected:
stack <MemberFuncPtr> instructionStep;
};
class MenuInstructScreen : public InstructionScreen
{
public:
MenuInstructScreen()
{
// Set instruction schedule
instructionStep.push( &MenuInstructScreen::step2() );
instructionStep.push( &MenuInstructScreen::step1() );
}
void step1()
{
// create some widgets that point to buttons & widgets that contain text instructions
}
void step2()
{
// create some widgets that point to buttons & widgets that contain text instructions
}
private:
};
class OptionsInstructScreen : public InstructionScreen
{
public:
OptionsInstructScreen()
{
// Set instruction schedule
instructionStep.push( &OptionsInstructScreen::step2() );
instructionStep.push( &OptionsInstructScreen::step1() );
}
void step1()
{
// create some widgets that point to buttons & widgets that contain text instructions
}
void step2()
{
// create some widgets that point to buttons & widgets that contain text instructions
}
private:
};