Tengo experiencia con Objective-C, y en Objective-C puede dejar que el compilador genere getters y setters para usted si no están ya presentes (@synthesize).

Hay una manera de hacer esto en C++, o tengo que implementar todos los getters y setters de mí mismo?

InformationsquelleAutor | 2011-08-02

8 Comentarios

  1. 31

    Yo no soy consciente de que una utilidad, y que probablemente no se vea mucho uso en idiomáticas C++ moderno:

    C++ moderno directrices sostienen que su clase de no tiene getters y setters. De hecho, incubadoras son casi completamente inútil, y getters sólo tienen utilidad muy limitada. Esto está relacionado con el bien establecido de ingeniería de software principio tell, don’t ask.

    Si quieres cambiar el estado de una instancia de una clase, hay dos maneras de hacer esto:

    1. De realizar una acción en que muta su estado.
    2. De crear una nueva instancia.

    La mutación de estado a través de incubadoras es generalmente una señal de código de olor y un mal diseño de la arquitectura.

    Voy a conceder que hay excepciones a esta regla, puramente debido a la practicidad. Y esto está muy bien, pero las excepciones son pocas, lo suficiente para que ellos no garantiza herramientas para auto-generar getters y setters. De hecho, usted puede utilizar esto como una prueba de fuego: cuando te encuentras deseando una herramienta para autogenerar tales repetitivo, dar un paso atrás y reconsiderar su diseño.

    • Podría usted me recomienda un moderno c++ guía de artículo/libro?
    • Consulte stackoverflow.com/q/388242/1968
    • no es este un poco (o incluso más) demasiado general? Por ejemplo esta declaración no tiene mucho sentido para los contenedores.
    • Es una pauta general. Como tal, es general, pero eso no significa que no se puede romper de vez en cuando. Y lo que realmente hace que una gran cantidad de sentido para los contenedores. Cuántos contenedores en el estándar de C++ biblioteca de incubadoras? A la derecha, cero. Cómo muchos de los captadores tienen lo que tienen? Muy pocas: esencialmente size, empty y tal vez capacity.
    • ah, supongo que no he entendido del todo’, incubadoras/getters’ entonces. Yo estaba bajo la impresión de que el operador [] sería considerado como un descriptor de acceso/getter..
    • es el uso de los captadores en un ORM sistema de una excepción o de ORM es malo en sí mismo (lo mismo para la MVC)? igual q, que se indique lo contrario: son ellos mismos los patrones correcta y justificar la excepción a esta regla son en realidad ‘feo’, y una herencia de getter/setter abuso?
    • ORM es podría decirse que mal – otras personas han argumentado que el Orm todo lo que eventualmente se descomponen en proyectos reales (no puede encontrar un enlace de ahora, lo siento). Pero funcionan bastante bien en la mayoría de los pequeños y tal vez incluso el tamaño medio de los proyectos, así que ¿por qué chuck ellos? Me gustaría decir por lo tanto que Orm son una excepción. Dicho esto, Orm puede fácilmente ser diseñados para tener inmutable los objetos que el trabajo con los constructores, por lo que incluso Orm puede ser diseñado setter-libre sin problema. Ya he utilizado un (manuscrito) ORM, funcionó muy bien. Como para MVC, que en realidad es abordado en los comentarios del artículo vinculado.
    • empty ni siquiera es realmente una llanura getter, en el sentido de que no se compone de return member_variable;.
    • Si usted le da a cada variable un get y set función, que no es realmente tan diferente de hacer las variables públicas.
    • En la mayoría de las definiciones es todavía un getter. Getters y setters puede la aplicación de la lógica – que es el punto entero de ellos; de otra manera sería sin sentido usarlas en lugar de las variables públicas.
    • Cuando escucho el término, creo que de un getter como una función que simplemente devuelve una variable de miembro, y un setter como algo que tiene un valor como entrada y establece la variable a ese valor, con la posibilidad adicional de comprobación de agregados en.
    • Cómo establecer el color rgb de un «color» de la clase, entonces?
    • Mediante la creación de una nueva instancia obviamente.
    • Pero para mutable clases necesito un setter si quiero mutar el color.
    • Seguro, pero ¿con qué frecuencia es que realmente sucede? Ya hemos mencionado un caso anterior: ORM. Pero esa es la excepción. A menudo, usted realmente no necesita cambiar las propiedades de un objeto después de la creación, o cuando lo hace, tiene más sentido para volver a crear el objeto desde el principio (después de todo, eso es lo que pasa con las cadenas en .NET!)
    • hacer el color público, problema resuelto. De hecho, una de color necesidades de la clase a ser nada más que struct color { double red, green, blue; };. Todo lo demás se puede hacer a través de funciones libres (preferiblemente de los puros).
    • Hacer color público significa que la clase es todavía mutable, es como tener un getter/setter, con la diferencia de que usted no puede controlar el código que se ejecuta cuando se llama a un setter, por lo tanto tiene menos control. No creo que sea prudente programa completamente sin incubadoras/getters, es cercano a lo imposible, y también muy ineficiente y poco inteligente.
    • Puedo asegurar que es absolutamente posible hacer eso, yo lo he hecho, funciona bien en algunos (la mayoría, diría) de las situaciones. De hecho, los lenguajes de programación funcional hacemos todo el tiempo y nadie se queja. (Y no, no por el uso público variables.)
    • No creo, por todas partes que usted necesita para utilizar una especie de incubadora, a menos que usted encuentra algún truco para que no los uso, pero el uso de algo equivalente. Un programa está hecha de memoria y las instrucciones, si sólo vas a usar objetos inmutables de su programa, el estado nunca va a cambiar, por lo tanto usted no puede hacer ningún tipo de opción en tiempo de ejecución.
    • También me down votado, porque te debe haber dicho cuando el uso de los objetos inmutables, y cuando no los uses, hay diferentes casos, usted no debería decir a no utilizar objetos inmutables, en absoluto, si es así ¿cuál es nuestro buen sentido hecho por? Debemos elegir siempre las cosas tan ciegamente? El segundo punto dice: «Se crea una nueva instancia.». Bueno, en este caso exacto, incluso si el objeto en sí no cambia, el puntero de cambios, por lo que necesita para hacerlo en un mutable de la clase. Siempre se necesita algo mutable en un programa.
    • Y lo siento si escribo mucho, pero también me gustaría decir que nosotros, como programadores, están hechas para tomar decisiones y decidir cuando utilizar un patrón en lugar de otro, y siempre hay una razón para ello. No solo tenemos que seguir siempre el mismo patrón, diciendo que es «bueno» vs el «mal», de otra forma no estaríamos programadores de todo.
    • Ah esto es realmente un muy aburrido debate, especialmente para los comentarios. Este es el libro de texto de conocimiento. Si usted está interesado en el debate, aprender acerca de la programación funcional y aprender un lenguaje de programación funcional (sugiero Haskell). A continuación, volver. Antes de que usted tiene este fundamento de hecho un debate que realmente no tiene sentido.
    • Estamos hablando de C++ por lo que no tienen para el estudio de Haskell para ello. C++ ‘s punto fuerte no es la programación funcional.
    • Eso es bastante irrelevante. Usted está argumentando en contra de una gran cantidad de investigación y conocimiento práctico. Para que este debate sea productivo necesario para ponerse al día en este conocimiento, y la mejor manera de hacer esto es mediante el aprendizaje de la programación funcional. Eso no significa que los hechos no se aplican a C++. Muy por el contrario: el orientado a objetos, personas ya han descubierto esta verdad para sí mismos.
    • Odio esta respuesta. No estoy en desacuerdo con «Teniendo como pocas incubadoras/captadores de lo posible, es mejor». Pero a veces tiene sentido. Incluso el autor del artículo en la respuesta dice: «me sugirió evitar accesos tanto como sea práctico. Que se ejecutará en los casos donde los descriptores de acceso es más limpia que cualquier otra solución…». Supongamos que necesito para comprobar la velocidad de un objeto en algún juego de código. Juego código no pertenecen al objeto. Lo que necesito es un captador de la velocidad. Los objetos inmutables son grandes, pero no eficiente. OP preguntaron cómo hacer algo. Decirles cómo. No cuestionar sus motivos.
    • OP parece estar satisfecho con la respuesta, como en: parece que lo han solucionado su problema subyacente. Y con respecto a su juego ejemplo, hay formas de hacer este trabajo, a pesar de que requieren fundamentalmente diferente de la API de decisiones. Pero, como se ha mencionado en otros comentarios, no estoy totalmente en contra de incubadoras. Lo que yo estoy totalmente en contra, es tal la abundancia de las incubadoras que no hay necesidad de autogenerar ellos. Que es, sin duda, el código de olor.
    • Alguien podría estar buscando una forma de generar ellos porque es más rápido que la escritura a mano, si hay muchos o pocos. Estas preguntas son realmente para todos, no sólo de la operación (por ejemplo, me topé con esta pregunta). Creo que es una respuesta directa a la pregunta con un comentario aparte sobre el mal diseño habría sido mucho mejor. También, mi ejemplo era muy artificial, pero mi punto es que los proyectos tienen diferentes tamaños, requisitos, código de la herencia, estilos de codificación… la Gente se tira alrededor de «Usted nunca hacer eso», pero es raro que se puede decir esto sobre el universo de todas las posibles tareas de programación.
    • Bueno, como he dicho, yo creo que tú no tiene muchos preparadores, y que, al hacerlo, la solución es repensar su API, no encontrar un generador para calmar los síntomas del código de olor. No estoy interesado en la prestación de quick&sucio soluciones aquí, estoy interesado en ayudar a la gente a escribir mejor código. Dicho esto, nada impide que a partir de su propia respuesta. De hecho, mi respuesta explícitamente dice que no es la respuesta para todo. Casi no es mi culpa que OP decidió que esta solucionado su problema, y lo aceptó. Que estaba destinado a estar junto a otras respuestas.
    • Código de los olores es tener una mezcla de las «ideologías» mixtos. Si utiliza setter y getter, entonces está bien. Si no, bien también. Sin embargo, si utiliza a continuación, están pidiendo problemas. También, según el compilador, algunos de ellos son inteligentes y reconocen el setter y getter y podría optimiza el código. Lo que he aprendido es que menos líneas no significa específicamente un mejor código. Mi 2cents.
    • Gracias por la actualización, @Krzyc.
    • ¿Su respuesta fue la relativa a público getters/setters ? Lo que si he dejado estos getters/setters privado, podrían acceso centralizado a la variable, de forma que es más fácil de depurar o actualizar el código ?

  2. 8

    No del propio compilador, pero un IDE como eclipse CDT en realidad puede realizar esta acción automatcally (clic derecho sobre la clase > Fuente > Generar Getters y Setters…).

  3. 4

    No hay manera de hacer esto. Sin embargo, si utiliza un completo IDE como Eclipse (no estoy seguro si Visual Studio tiene esta característica), hay opciones convenientes para tener el IDE generar el getter/setter código para usted.

    • puedes dar más información sobre esto ?
    • Si usted está usando Eclipse CDT, usted puede encontrar instrucciones sobre cómo generar getters/setters aquí.
  4. 2

    No, el compilador no le ayuda con eso. Por ejemplo, podría crear una MACRO, o generar algún código en el paso de generación..

    • Macro = difícil o imposible de depuración
    • bostezo…es esta la respuesta automática si en algún lugar de la MACRO de word se utiliza?
  5. 1

    La ventaja para mí de la utilización de los descriptores de acceso (especialmente fácil en forma de c# vb.net) es

    1/la posibilidad de establecer un punto de interrupción en una incubadora o un captador de otra cosa que usted no puede saber quien y cuando se tiene acceso a los miembros.

    2/puede controlar qué valor se establece en caso de necesidad de la prueba de desbordamiento o de otro mal configurado. Esto es especialmente necesario en un público libray, como un editor de propiedades para su componente visual por ejemplo.

    Pero esto no es totalmente necesario en su clase interna. Entonces la elección de un acceso controlado a un miembro debe establecerse desde el final de la utilización pública de su objeto, creo.

  6. 0

    Al menos en Visual Studio 2015, no la puedo encontrar. Sin embargo, si utiliza Resharper, entonces podría genera el setter y getter en el .h archivo

Dejar respuesta

Please enter your comment!
Please enter your name here