Elijo Num.3 (también conocida como la versión detallada). Es más mecanografiado, pero la intención es exacta para ti y para el compilador. El problema que publicaste tal cual es en realidad más simple que el mundo real. En el mundo real, existen otros ámbitos para las definiciones, no solo los miembros de la clase. Sus definiciones no son muy complicadas solo con clases, porque su alcance nunca se vuelve a abrir (a diferencia de los espacios de nombres, el alcance global, etc.).
Num.1, esto puede fallar con ámbitos que no sean clases, cualquier cosa que se pueda volver a abrir. Por lo tanto, puede declarar una nueva función en un espacio de nombres utilizando este enfoque, o sus líneas pueden terminar siendo sustituidas a través de ODR. Lo necesitará para algunas definiciones (en particular, especializaciones de plantillas).
Num.2 Esto es muy frágil, particularmente en bases de código grandes - a medida que cambian los encabezados y las dependencias, su programa no podrá compilarse.
Núm.3 Esto es ideal, pero hay mucho que escribir: cuál es su intención de definir algo . Esto hace exactamente eso, y el compilador se activa para asegurarse de que no haya cometido un error, una definición no esté desincronizada con su declaración, etc.