2009-08-01 13 views
16

Ésta puede ser una & sencilla pregunta corta, pero nunca he encontrado una respuesta satisfactoria a la misma:C++ main() en un gran POO proyecto

¿Qué código que hace la función main() por lo general consisten en una gran proyecto de C++? ¿Sería una suposición incorrecta pensar que generalmente se está inicializando un objeto de clase (envoltura) y llamando a una función dentro de él para que se desactive?

¿Por qué main() no es un método en primer lugar? ¿Es para preservar la compatibilidad hacia atrás con C?

+1

La razón por la cual no es una función de miembro es que entonces necesitaría una forma de especificar de qué clase es una función miembro. C++ no tiene nada que ver con el manifiesto de Java y sin reflexión. –

+0

desde un nivel más conceptual, cada programa necesita un punto de entrada, en el caso de C++ "clásico" esto está dentro del ejecutable que produce el compilador, cuando el programa comienza no existe una clase en la que pueda ser un método principal. En los lenguajes interpretados, el tiempo de ejecución se ejecuta primero y configura un contexto para que la aplicación se ejecute antes de que comience, por lo que el punto de entrada es un método/miembro de alguna clase previamente configurada si el idioma/tiempo de ejecución lo permite/desea. – Mark

+2

@Mark: ¿qué? El compilador es responsable de emitir código para inicializar varias cosas, incluidos los miembros estáticos de las clases, antes de que se ejecute main(). En la medida en que se puede decir que las clases existen en tiempo de ejecución en C++, existen muchas clases antes de que se llame al punto de entrada. Incluso podría haber muchos objetos en existencia también. –

Respuesta

10

En mi código, básicamente es una llamada de constructor, posiblemente una llamada de método, y un manejo de excepción. Esta es la principal propia de mis proyectos (encabezados y comentarios omitidos, y el formato en mal estado por lo tanto, como de costumbre):

int main(int argc, char * argv[]) { 
    int result = 0; 
    try { 
     CLIHandler ch(argc, argv); 
     result = ch.ExecCommand(); 
    } 
    catch(const Exception & ex) { 
     result = ExceptionHandler::HandleMyError(ex); 
    } 
    catch(const std::exception & ex) { 
     result = ExceptionHandler::HandleOtherError(ex); 
    } 
    catch(...) { 
     result = ExceptionHandler::HandleUnknownError(); 
    } 
    return result; 
} 
+0

¿Por qué no simplemente reemplazas todo tu 'result =' con 'return'? – GManNickG

+2

¡Lávate la boca! ¿Nunca has oído hablar del requisito de que en un código bien estructurado, una función debe tener solo un punto de salida? Pero para ser serio, mi camino es más fácil de depurar, ya que tiene una variable para inspeccionar. –

+0

Ah, ya veo lol. Me asustaste. Yo estaba como, "FUUU- ¿Qué ?!". Supongo que nunca tuve que inspeccionar la variable de devolución, mi controlador de errores la imprime junto con la excepción. De lo contrario, nuestro código es el mismo. – GManNickG

1

La respuesta corta: depende. Bien puede crear algunos objetos locales que son necesarios para la duración del programa, configurarlos, contarles sobre el otro y llamar a un método de larga ejecución en uno de ellos.

Un programa necesita un punto de entrada. Si main tenía que ser un método en un objeto, ¿qué tipo de clase debería ser?

Con main como punto de entrada global, puede elegir qué configurar.

2

mina suele hacer

  • de línea de comandos de análisis
  • inicialización de alto nivel objetos
  • manejo de excepciones
  • entrar en bucle principal 'exec'

Como lo entiendo , int main(int argc, char *argv[]) es esencialmente una convención debido al patrimonio C. Nunca me pareció extraño, pero más útil. C++ extiende C después de todo ... (y sí, hay una gran diferencia, pero esa no era la pregunta aquí).

2

Sí, la razón es la compatibilidad con versiones anteriores. main es el único punto de entrada permitido en un programa C que produce ejecutables, y por lo tanto en un programa C++.

En cuanto a qué hacer en un C++ principal, depende. En general, solía:

  • realizar la inicialización mundial (por ejemplo, del subsistema de registro)
  • argumentos de línea de comandos de análisis y definir una clase adecuada que contiene los
  • asignar un objeto de aplicación, su puesta en marcha, etc.
  • ejecutar el objeto de la aplicación (en mi caso, un método de bucle infinito. Programación de la GUI)
  • hacer la finalización después de que el objeto haya completado su tarea.

Ah, y se me olvidó la parte más importante de una aplicación

  • muestran la pantalla de bienvenida
0

Usted puede utilizar una función miembro de la clase estática en lugar del principal con el compilador MSVC++ seleccionando el punto de entrada en la configuración del proyecto, debajo de las opciones del vinculador avanzado.

Realmente depende de su proyecto en cuanto a lo que desea colocar allí ... si es pequeño también puede colocar los bucles de mensajes, la inicialización y el código de apagado allí. En proyectos más grandes, tendrá que moverlos a sus propias clases/funciones o menos tener una función de punto de entrada monolítico.

0

No todas las aplicaciones C++ son OOP y, de cualquier manera, todos los códigos requieren algún punto de entrada para comenzar.

Cuando estoy escribiendo código OOP, mi main() tiende a incluir una instanciación de objetos, tal vez proceda con alguna entrada del usuario. Lo hago de esta manera porque siento que el 'trabajo' debe hacerse dentro de un objeto, de lo contrario, el código no está escrito en el 'espíritu' de OOP.

0

Los proyectos realmente grandes no suelen abarcar un solo programa. Por lo tanto, habrá varios ejecutables, cada uno con su propio main. De paso, es bastante común que estos ejecutables se comuniquen de forma asincrónica a través de las colas.

Sí, cada main tiende a ser muy pequeño, inicializando un framework o lo que sea.

¿Quiere decir por qué main() es una función en lugar de un método de clase? Bueno, ¿en qué clase sería un método de? Creo que es sobre todo herencia de C++ de C, pero ... todo comenzó en alguna parte :-)

+1

main es una función, no un método ... – micmoo

+0

Gracias, sí, tienes razón. – djna

0

lo general el uso principal de la lectura en la línea de comandos, la inicialización de variables globales, y luego llamando a las funciones/métodos apropiados.

1

Mi función main() a menudo construye varios objetos de nivel superior, dándoles referencias entre sí. Esto ayuda a minimizar el acoplamiento, manteniendo las relaciones exactas entre los diferentes objetos de nivel superior confinadas a la principal.

A menudo esos objetos de nivel superior tienen distintos ciclos de vida, con los métodos init(), stop() y start(). La función main() administra la obtención de los objetos en el estado de ejecución deseado, espera lo que sea que indique que es hora de apagar y luego cierra todo de manera controlada. De nuevo, esto ayuda a mantener las cosas desacopladas correctamente y mantiene la administración del ciclo de vida de alto nivel en un lugar fácil de entender. Veo este patrón mucho en sistemas reactivos, especialmente aquellos con muchos hilos.

Cuestiones relacionadas