Занимаясь созданием ПО уже многие годы пришло осознание, что любые большие и сложные вещи лучше дробить на более мелкие и соответственно более понятные. Это касается функций, классов, библиотек. В плане всего приложения также лучше придерживаться аналогичного подхода. Поэтому и пришла мне в голову идея изначально заложить в приложения модульность в соответствии с которой приложение состоит из частей. В каждый момент времени пользователю демонстрируется одна какая-то часть, которая и обеспечивает необходимый функционал. Ну и соответственно пользователь может свободно между этими частями переключаться. Сразу же наваял несколько классов. Здесь привожу их декларации для демонстрации выбранного подхода:

/**
* Logical part of the application.
*/
class GDAPI CApplicationPart
{

protected:

/**
* Pointer to the application.
*/
CApplication * Application;

public:

/**
* Default constructor.
*/

CApplicationPart( void );

/**
* Method runs application part when necessary.
*/
virtual void Run( void ) = 0;

/**
* Destructor.
*/
virtual ~CApplicationPart();

/**
* Setting application pointer.
*/
void SetApplication( CApplication * App );

};

/** * Application API adapter. */ class CApplicationAdapter { public: /** * Method sets active application parts. */ virtual void SetActiveApplicationPart( const char * ApplicationPartName ) = 0; }; /** * Application class wich splits application into logical functional blocks with transitions between them. */ class GDAPI CApplication: public CApplicationAdapter { /** * Active application part. */ CApplicationPart * ActiveApplicationPart; /** * Application parts. */ std::map< std::string , CApplicationPart * > ApplicationParts; /** * No copy constructors. */ CApplication( const CApplication & Application ); /** * No copy operators. */ CApplication operator=( const CApplication & Application ); public: /** * Default constructor; */ CApplication( void ); /** * Appending application part. */ void AddApplicationPart( const char * ApplicationPartName , CApplicationPart * ApplicationPart ); /** * Method sets active application parts. */ virtual void SetActiveApplicationPart( const char * ApplicationPartName ); /** * Method runs application. */ virtual void Run( void ); /** * Method destroys all elements. */ virtual void Destroy( void ); /** * Destructor. */ virtual ~CApplication( void ); };