Buenos días.
Si me aceptas la crítica:
1. La lógica de tu "programa" no debería residir en un constructor. Eso es, por decirlo de forma suave, una aberración. Es mucho mejor tener un método público en "programa" para realizar esta tarea.
2. Separas interfaz de implementación... pero ya está. Creo que el ejemplo sería más útil si separases además la lógica de presentación de la lógica de negocio.
3. Llamar al constructor de la clase desde un miembro sin crear una instancia nueva es otra aberración consecuencia directa de lo comentado en el punto 1. Otro motivo más para cambiar eso.
4. Si una función miembro de una clase no modifica el estado del objeto lo suyo es que sea etiquetada como "const". Si además resulta que dicha función no accede al estado del objeto (las variables miembro de la clase), lo lógico es que dicha función fuese etiquetada como "static". Por cierto, no puedes usar "static" y "const" a la vez en la misma función miembro (básicamente porque una función static no puede acceder, y por tanto modificar, a nada que no sea estático... de hecho en esta función no existirá el puntero implícito "this").
Te animo a seguir mejorando el ejemplo
Un saludo