2010-07-01 17 views

Respuesta

9

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.

+0

Uhm, ¿por qué el -1? –

+0

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

+1

@glow Eso no suena nada como una función incluida con C++, que parece ser lo que el OP solicitó –

2

No, debe encapsular la variable en un par de métodos get/set.

3

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.

13

¿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.

+0

¿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

+3

@ 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". –

+1

El uso de boost :: function y/boost :: signals (2) haría de esto una mejor solución. –

1

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.

0

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.

Cuestiones relacionadas