¿Hay una función en C++ que cuando una variable se cambió automáticamente llama a una función?Función de llamada automática C++ después de la variable de cambio
Respuesta
En una palabra; no.
Pero lo que debe hacer es envolver la variable en una clase (que no voy a sugerir la sobrecarga de operadores), y cambiarlo a través de una función de conjunto (...). Entonces simplemente llama a la función desde la función establecida.
No, debe encapsular la variable en un par de métodos get/set.
usted podría hacer la variable privada a alguna clase y luego usar las funciones miembro para el cambio en el primer lugar.
se puede poner su código adicional en la propia función miembro, o puede tener ese código separado y tienen la función de miembro llaman en el cambio.
¿Hay una función en C++ que cuando se cambia una variable, automáticamente llama a una función?
No, no es que se me ocurriera. Sin embargo, puede ajustar el acceso a la variable en un contenedor adecuado que le permita enganchar en la tarea.
Algo como esto:
//Beware, brain-compiled code ahead!
template<typename T>
class assignment_hook {
public:
typedef void (hook_t)(const T& old_value, const T& new_value);
assignment_hook(T& value, hook_t hook) : ref_(value), hook_(hook) {}
T& operator=(const T& rhs)
{
hook_(ref_,rhs);
ref_ = rhs;
}
private:
// I'd rather not want to think about copying this
assignment_hook(const assignment_hook&);
void operator=(const assignment_hook&);
T& ref_;
hook_t hook_;
};
Como Noah señaló en un comentario,
typedef boost::function<void(const T&,const T&)> hook_t;
(o, si el compilador lo tiene, std::tr1::function
o std::function
) mejoraría en gran medida de que, ya que permite a todos tipos de funciones "compatibles" para llamar. (Por ejemplo, habilita todo tipo de magia usando boost/std::/tr1::bind<>
para llamar a funciones miembro y otras cosas)
También tenga en cuenta que, como dijo adf88 en sus comentarios, esto solo hace lo que se solicitó (acceso de escritura de monitor a una variable) y de ninguna manera es una implementación de propiedad en toda regla. De hecho, a pesar de la actitud de C++ para implementar tanto como sea posible en las bibliotecas y lo menos posible en el lenguaje, ya pesar de los intentos de muchas personas (algunas de ellas bastante inteligentes), nadie ha encontrado una forma de implementar propiedades en C++ como una biblioteca, sin soporte del idioma.
¿No crees que también complica? ¿mucho? ¿Qué hay de otros operadores? ¿Qué hay de tomar una dirección? Usted frena la semántica aquí. Si el compilador no es compatible con las propiedades, no es una buena solución para simularlas. -1 – adf88
@ adf88: ¿qué quiere decir con "complica demasiado"? Si quiere hacer lo que le preguntó el interrogador, entonces esto es lo más simple posible. En cuanto a su último punto, el compilador no admite directamente arreglos redimensionables, objetos de función, punteros inteligentes, metaprogramación de plantillas u otros muchos conceptos que se han convertido en expresiones idiomáticas comunes de C++ (o incluso estándar) al escribir código para "simularlas". –
El uso de boost :: function y/boost :: signals (2) haría de esto una mejor solución. –
Dependiendo de la complejidad de su programa, usted podría utilizar detectores que monitorizan ciertos objetos para los cambios de estado, y tienen otras partes de su programa de suscripción de eventos de ese oyente.
Sin embargo, la mejor opción sería la de poner esta funcionalidad en el método de selección para esa variable. Podría ser la funcionalidad del oyente o una llamada a función directa.
Puede encapsular esa variable y tener oyentes que se notifiquen cuando cambie el valor. Me gustaría ir con señales de impulso :: o impulso :: signals2 para ello:
http://www.boost.org/doc/libs/1_43_0/doc/html/signals2.html
y esto es algo de información sobre el patrón de observador: http://en.wikipedia.org/wiki/Observer_pattern
Si la variable tiene un tipo de clase, puede sobrecargar su función operator =()
. No puede hacer esto si la variable es un tipo primitivo.
- 1. llamada de función python con la variable
- 2. Función No Cambio Global Variable
- 3. función de llamada después de .load (Jquery)
- 4. puntero después de la llamada a la función
- 5. Función de llamada Ajax después del éxito
- 6. Función de llamada jQuery después de la carga
- 7. JQuery Slider - Función de llamada después de la diapositiva
- 8. JavaScript devolución de llamada después de la función
- 9. función de llamada automática cada vez que x
- 10. Llamada C# dll función de C++/CLI
- 11. Valor de retorno de C++ creado antes o después de la destrucción automática de var.
- 12. Función de llamada de Javascript después de window.open
- 13. asíncrona llamada de función para C++
- 14. Función C cambio de valor a la vuelta. Pila corrupta?
- 15. C++ identificador de llamada de función
- 16. Función de llamada a Excel VBA con nombre de variable
- 17. señal de llamada después de la horquilla
- 18. Llamada a la función anulada de la función de anulación
- 19. Optimización de Java: variable local o llamada de función
- 20. obtienen llamadas nombre de la función de la función llamada
- 21. C: ¿Llama gratis en una variable automática?
- 22. llamada de función en la cláusula WHERE
- 23. C++ y destructor llamada de función para
- 24. cómo rastrear llamada de función en C?
- 25. Anular una llamada de función en C
- 26. Llamada de cambio de página de tablas de datos
- 27. Configuración de la variable local en una función de devolución de llamada de JavaScript
- 28. Definir índice de matriz después de la llamada a la función
- 29. Convención de llamada personalizada X86_64 a C llamada a función
- 30. Llamada a la función c desde Java
Uhm, ¿por qué el -1? –
En una palabra: sí. Con una cantidad moderada de esfuerzo, un oyente puede monitorear la variable en busca de cambios en un programa de subprocesos múltiples y llamar funciones en consecuencia. Incluso en un sistema no multiproceso, podría funcionar, aunque sería un truco. No estoy diciendo que lo recomiende, ya que la opción del setter es (probablemente) mejor, pero decir que no se puede hacer es simplemente incorrecto. – corsiKa
@glow Eso no suena nada como una función incluida con C++, que parece ser lo que el OP solicitó –