Se conoce como Ingeniería inversa al hecho de tener solo un ejecutable y haciendo uso de un lenguaje (regularmente ensamblador) obtener el diseño del programa (clases, módulos, constantes, etc), básicamente tu tienes el código en C y lo único que vas a hacer es ajustarlo para utilizarlo en C++, no vas a aplicarle ingeniería inversa.
Star UML como bien te comentaron sirve para esa función, pero no recuerdo que lenguajes te maneja ya que lo he utilizado pero siempre generando las salidas en Java, ya que supongo que al final de hacer tus diagramas de estado, clases, etc, quieres obtener el "esqueleto" de las clases para utilizarlo en C++, checalo y pueda que si te sirva, saludos.