2009-06-08 15 views
24

Me sigo confundiendo sobre esta decisión de diseño muchas veces cuando estoy escribiendo programas, pero no estoy 100% seguro de cuándo debo hacer una función para ser una función miembro de una clase, cuándo dejarla como una función normal en la que otros archivos fuente pueden llamar a la función cuando la declaración de la función se expone en un archivo de encabezado. ¿El acceso deseado a las variables miembro de una clase tiene que ver con la decisión la mayor parte del tiempo?C++ Funciones de miembros vs funciones gratuitas

+9

Tenga en cuenta también que "método" es un término orientado a objetos generales. C++ no tiene "métodos", solo "funciones". El estándar C++ nunca usa el término "método". En su lugar, prefiere usar "función de miembro" o "función gratuita". –

+1

El comentario de Brian realmente debería ser la respuesta. Eso es lo que buscan la mayoría de las personas que vienen aquí ... esta pregunta ni siquiera menciona los métodos. –

+0

De acuerdo. Probablemente debería cambiar el título de la pregunta, de hecho es engañoso. – Ben

Respuesta

26

La Interfaz Principio por Herb Sutter

Para una clase X, todas las funciones, incluyendo las funciones libres, que tanto
(a) "Mención" X, y
(b) están "suministrado con" X
son lógicamente parte de X, debido a que forman parte de la interfaz de X.

Para discusión a fondo leer Namespaces and the Interface Principle por Herb Sutter.

EDITAR
En realidad, si se quiere entender C++ ir y leer todo lo Herb Sutter ha escrito :)

+0

Gracias por su respuesta. El enlace es bastante descriptivo. – stanigator

+8

(+1). También me gusta este de Scott Meyers: http://www.ddj.com/cpp/184401197. Los artículos de Scott y Herb se complementan enormemente, creo. –

+1

Estoy confundido. El artículo vinculado trata sobre espacios de nombres, pero la pregunta no es sobre espacios de nombres. Se pregunta cuándo tener "funciones gratuitas" frente a "funciones de miembros". –

0

Si algo necesita acceder a variables miembro o algún aspecto de una instancia del objeto, a continuación, debería ser un método.

Si está estrechamente relacionado con la clase, pero no necesita acceder a ninguna información específica de la instancia, debe ser una función compartida (o función de clase, o función estática según el lenguaje de programación con el que se trate)

Incluso si solo se trata de una función genérica, es probable que tenga más de uno de ellos y que se pueda agregar/organizar de acuerdo con algún concepto. Luego, puede crear una clase que represente ese concepto y hacer que sean funciones compartidas.

Dado lo anterior, nunca más veo razones para crear funciones independientes.

+0

C++ no tiene ningún concepto de métodos. –

+4

método == función de miembro – PSkocik

2

Uso las clases cuando necesito mantener el estado. Si una función no necesita acceso a información de estado mantenida, entonces prefiero una función gratuita porque facilita la prueba y la reutilización de código.

Si tengo un montón de funcionalidades relacionadas pero no necesito mantener el estado, entonces prefiero poner funciones gratuitas en un espacio de nombres.

Cuestiones relacionadas