Error del compilador con el parámetro de la plantilla = void* - página 19

 
pavlick_:

¿Autodestrucción? - eso es nuevo :).

Sí, autodestrucción. Supongo que eres consciente de que esta es la diferencia entre los objetos de la "pila" y los objetos dinámicos: no te preguntan cuándo deben borrarse, lo hacen cuando salen del bloque del programa de origen :)
 
Ilya Malev:
Sí, autodestrucción. Supongo que eres consciente de que esta es la diferencia entre los objetos de la "pila" y los objetos dinámicos: no te preguntan cuándo deben borrarse, lo hacen cuando salen del bloque del programa de origen :)

Probablemente hayas oído hablar de los constructores/operadores de copia/movimiento, ¿verdad?

obj o;
{
   obj q;
   o = q;
   o = move(q);  // С++ вариант, более эффективный
}
 
pavlick_:

Probablemente hayas oído hablar de los constructores/operadores de copia/movimiento, ¿verdad?

Así que estaremos atentos a ese momento crucial y lo copiaremos así, si no llegamos demasiado tarde... :lol:

¿Sólo porque realmente no nos gusta la OOP, o hay otras razones ocultas?

 
Ilya Malev:

Así que estaremos atentos a ese momento crucial y lo copiaremos así, si no llegamos demasiado tarde... :lol:

¿Sólo porque realmente no nos gusta la OOP, o hay otras razones ocultas?

Por supuesto, ¿cómo podría haber otra cosa? Usted, como proger decente, debe gestionar los objetos dinámicos a través de los de la pila también (técnica RAII)

{
   unique_ptr<Class> p(new Class);
   ...
   // ой, самоуничтожение :)
}
 
Y, diablos, construiremos un montón de envoltorios para ello. Porque el nicho del polimorfismo no es tan significativo, pero nuestras muletas tienen todo un campo de aplicación, si no usamos la POO :cry:
 
pavlick_:

Por supuesto, ¿cómo podría ser si no? Como proger decente, tienes que gestionar los objetos dinámicos a través de objetos de pila también (técnica RAII).

¿Te refieres al recolector de basura? )))) o sobre el recuento del número de referencias. he estado practicando estas cosas últimamente. pero desafortunadamente el rendimiento de todos estos enfoques es muy pobre en µl

 
Gestionar los objetos din.a través de los de pila significa asignar 24 bytes ADICIONALES de memoria para cada objeto (eso es lo que "pesará" dicho "puntero de pila "+referencia al objeto en sí). Además, el coste de tiempo en términos de velocidad no es nada pequeño. Todo esto es bastante triste en general. Pero tampoco sentimos una gran necesidad en ella. Como dicen, el miedo tiene muchos ojos. Si estuviéramos programando estaciones espaciales, no se podría prescindir de un control estricto. Pero tal y como están las cosas, con un sistema de clases bien ajustado, todo funciona bien sin él.
 

No, no se trata de un recolector de basura, sino de punteros inteligentes - unique_ptr, shared_ptr (con conteo de referencias), RAII fácil de googlear. Generalmente no hay costo extra para unique_ptr en términos de memoria (envoltura == tamaño del puntero), y las llamadas están sobre-optimizadas, pero en µl todo es triste, sí. Pero tampoco es necesario aquí (punteros inteligentes).

 
pavlick_:

O podría tomar las plantillas y escribir algo así:

https://www.mql5.com/ru/forum/295485/page18#comment_9971363

Button también es independiente de los detalles, sin todo el polimorfismo y las interfaces. El polimorfismo tiene su propio nicho, pero es mucho más estrecho de lo que dicen.

En este ejemplo simplificado, la plantilla tiene ciertamente un mejor aspecto. De hecho, ni siquiera necesitas una plantilla allí, ya que sólo tienes una instancia.

 
Alexey Navoykov:

Este ejemplo simplificado ciertamente hace que la plantilla parezca más conveniente. De hecho, ni siquiera necesitas una plantilla allí, ya que sólo tienes una instancia.

Lámpara de botones vía g con virtualidad:

struct SwitchableDevice {
    virtual void switchOn() = 0;
    virtual void switchOff() = 0;
};
struct Lamp : SwitchableDevice {
    void switchOn(){std::cout << "shine bright" << std::endl;}
    void switchOff(){std::cout << "i am not afraid of the dark" << std::endl;}
};
struct Button {
    SwitchableDevice& dev;
    bool state = false;
    Button(SwitchableDevice& d) : dev(d) {}
    void buttonPress(){
        if (state) { dev.switchOff(); }
        else       { dev.switchOn();  }
        state = !state;
    }
};
int main(){
    Lamp lamp;
    Button button(lamp);
    button.buttonPress();
    button.buttonPress();
}

ejemplos manidos.