2011-01-29 29 views
6

¿Cuál es el enfoque correcto a tomar:miembro definición de función

definir la función miembro (clase) dentro la clase?

Definir la función de miembro (clase) fuera de la clase?

Gracias.

+1

No estoy seguro de si quiere decir dentro del cuerpo de la clase, pero si lo hace podría ser una lectura que vale la pena: http://www.parashift.com/c++faq-lite/inline-functions.html#faq -9.8 – Skurmedel

+1

Es posible que desee comprobar [una pregunta similar sobre los constructores] (http://stackoverflow.com/questions/4761834/defining-constructor-in-header-file-vs-implementation-cpp-file), básicamente las respuestas y el razonamiento permanece igual. –

+0

@ Skurmedel. Sí, en el cuerpo de la clase – Simplicity

Respuesta

2

A menos que la definición de la función miembro sea trivial (en un sentido informal) y no introduzca ninguna dependencia adicional, normalmente definiría una función miembro fuera del cuerpo de la clase en un archivo fuente separado.

A menudo es una cuestión de estilo, pero hay algunos casos en los que es necesario y muchos otros casos en los que es deseable definir la función fuera del cuerpo de la clase.

Por ejemplo, en los casos en que tiene clases interdependientes y solo se puede disponer una declaración directa de otra clase antes de la definición de clase, una función miembro que utiliza la definición de esa otra clase solo se puede definir fuera del cuerpo de clase después de que se haya proporcionado una definición completa de la otra clase.

+0

+1, ya que trae las decisiones importantes, pero no es una cuestión de estilo. Al proporcionar la implementación en la declaración de clase, usted está forzando sus dependencias (detalles de implementación) en sus usuarios (es decir, si usa alguna biblioteca para realizar un cálculo específico, los usuarios de su clase dependerán de ella), y también tendrá la práctica efecto de forzar a todas las unidades de traducción que incluyen su clase a compilar todos sus métodos, aumentando los tiempos de compilación. –

+0

@ DavidRodríguez: Bueno, hay un estilo malo, incluso un estilo muy malo, y donde ambos son posibles y "correctos", debe ser una decisión de estilo, ¿no? –

+0

Es por eso que hice upvote :) Tu respuesta trae las cosas más importantes que tienes que considerar en el alcance. –

1

¿Se refiere a "en la declaración de clase/.h archivo" vs "en un archivo .cpp utilizando ::"?

Si es así, siempre voy por este último. Cuando se trata de depurar, es mucho más fácil dar un paso adelante y ver qué está pasando. También ayuda a declutter la declaración de clase, que no necesita conocer ningún detalle de implementación "

0

si lo vemos de acuerdo con el problema de rendimiento que es la forma más efectiva de declarar la función en la clase, porque en el momento de la compilación conects todas las llamadas funcation y otros componentes, de forma que lo hará fácil y debe ser más rápido para conseguir todo en una fuente ...

+0

En general, el código generado a partir de los métodos definidos dentro del cuerpo de la clase y el exterior será el mismo. No hay diferencia en el rendimiento. – Zane

9

Suponiendo que estamos hablando de estas tres posibilidades:

  1. método definido en la definición de la clase en el archivo de encabezado.
  2. Método define afuera definición de clase en el archivo de encabezado.
  3. Método defina la definición de clase externa en el archivo de implementación.

A continuación, las pautas del proyecto y la empresa pueden obligarlo a utilizar (1) o (3) siempre.

Cuando usted tiene una opción, es mi humilde opinión la mejor manera de adaptarse a las circunstancias que nos ocupa, teniendo en cuenta cosas tales como

  • ¿Quieres un módulo sólo de encabezado? Entonces (1) como predeterminado, (2) posible.
  • ¿Es el método una bestia grande? Entonces (2) o (3).
  • ¿Especialización en el método de la plantilla? Entonces (2) o (3).
  • ¿Hay un problema de compilación (compilaciones lentas)? Indica (3).
  • ¿Clase de plantilla?(1) o posiblemente (2)

Pero excepto cuando la elección se ve obligado de manera efectiva en que, sobre todo, consideran que el claridad de su código. .

Saludos & HTH,

1

Si desea definir una función dentro una clase de la sintaxis más básica se ve generalmente como:

class Object 
{ 
    int property; 
    void doSomething() 
    { 
     property=100; 
    } 
}; 

Si desea definir una función fuera es similar a declarar funciones antes que main y en archivos de biblioteca. En su clase tiene:

class Object 
{ 
    int property; 
    void doSomething(); 
}; 

Entonces en algún lugar después de su clase, después de la función main() o en un archivo incluido puede tener la definición:

void Object::doSomething() 
{ 
    property=100; 
} 

Algunas clases lugar en un fichero de cabecera y las definiciones en un archivo cpp utilizado por ese encabezado. Varias técnicas posibles.

Ambos enfoques son válidos. A menudo incluiré la funcionalidad de clase básica y/o muy pequeña directamente dentro de la clase y otras funciones que tienden a separar. Intenta pensar la diferencia al encontrar tu código y querer alterarlo.

2

Un consejo común es mantener encabezados tan simples y limpios como sea posible. Los encabezados se incluirán por código externo y deberán procesar todo lo que haya escrito allí. Si escribe un método en el encabezado, todas las unidades de traducción compilarán esa función, solo para que el vinculador pueda descartar todas menos una de ellas más adelante.

Si su código tiene una dependencia interna en un tipo o biblioteca que no es parte de su interfaz, al insertar el código de la función miembro en la declaración de clase, la definición de esa clase o los encabezados de esa biblioteca tendrán para ser incluido en su encabezado, y eso significa que está filtrando los detalles de su implementación a sus usuarios.

Cuestiones relacionadas