Bogue de compilation avec le paramètre template = void* - page 19

 
pavlick_:

Autodestruction ? - c'est nouveau :).

Oui, l'autodestruction. Je suppose que vous savez que c'est la différence entre les objets "stack" et les objets dynamiques - ils ne vous demandent pas quand se supprimer, ils le font quand ils quittent le bloc de programme d'origine :)
 
Ilya Malev:
Yep, auto-destruction. Je suppose que vous savez que c'est la différence entre les objets "stack" et les objets dynamiques - ils ne vous demandent pas quand se supprimer, ils le font quand ils quittent le bloc de programme d'origine :)

Vous avez probablement entendu parler des constructeurs/opérateurs de copie/déplacement, n'est-ce pas ?

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

Vous avez probablement entendu parler des constructeurs/opérateurs de copie/déplacement, n'est-ce pas ?

Nous serons donc à l'affût de ce moment crucial et le copierons de cette façon, si seulement nous n'arrivons pas trop tard ? :lol :

Juste parce que nous n'aimons vraiment pas la POO, ou y a-t-il d'autres raisons cachées ?

 
Ilya Malev:

Nous serons donc à l'affût de ce moment crucial et le copierons de cette façon, si seulement nous n'arrivons pas trop tard ? :lol :

Juste parce que nous n'aimons vraiment pas la POO, ou y a-t-il d'autres raisons cachées ?

Bien sûr, comment pourrait-il en être autrement ? En tant que bon proger, vous devez également gérer les objets dynamiques par le biais de piles (technique RAII).

{
   unique_ptr<Class> p(new Class);
   ...
   // ой, самоуничтожение :)
}
 
Et nous ferons beaucoup d'emballages pour ça, bon sang. Parce que la niche du polymorphisme n'est pas si importante, mais nos béquilles ont tout un champ d'application, si nous n'utilisons pas la POO :cry :
 
pavlick_:

Bien sûr, comment pourrait-il en être autrement ? En tant que proger décent, vous devez également gérer les objets dynamiques via des objets de pile (technique RAII).

Tu veux dire le collecteur d'ordures ? )))) ou sur le comptage du nombre de références. J'ai pratiqué ces choses dernièrement, mais la performance de toutes ces approches est nulle en µl malheureusement.

 
Gérer les objets din.via la pile signifie allouer 24 octets de mémoire SUPPLÉMENTAIRES pour chaque objet (c'est le "poids" de ce "pointeur de pile "+référence à l'objet lui-même). De plus, le coût du temps en termes de vitesse n'est pas du tout négligeable. Tout cela est plutôt triste dans l'ensemble. Mais nous n'en ressentons pas non plus un grand besoin. Comme on dit, la peur a beaucoup d'yeux. Si nous programmions des stations spatiales, alors vous ne pourriez pas vous passer d'un contrôle strict. Mais en l'état actuel des choses, avec un système de classes bien réglé, tout fonctionne très bien sans lui.
 

Non, il ne s'agit pas de collecteur de déchets, mais de pointeurs intelligents - unique_ptr, shared_ptr (avec comptage de référence), RAII facilement googlé. En général, il n'y a pas de coût supplémentaire pour unique_ptr en termes de mémoire (wrapper == taille du pointeur), et les appels sont sur-optimisés, mais dans µl tout est triste, oui. Mais il n'est pas nécessaire ici non plus (pointeurs intelligents).

 
pavlick_:

Ou vous pourriez prendre les modèles et écrire quelque chose comme :

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

Button est également indépendant des détails, sans tout le polymorphisme et les interfaces. Le polymorphisme a sa propre niche, mais elle est beaucoup plus étroite qu'on ne le dit.

Dans un exemple aussi simplifié, le modèle semble certainement plus pratique. En fait, vous n'avez même pas besoin d'un modèle à cet endroit, puisque vous n'avez qu'une seule instance.

 
Alexey Navoykov:

Cet exemple simplifié rend certainement le modèle plus pratique. En fait, vous n'avez même pas besoin d'un modèle à cet endroit, puisque vous n'avez qu'une seule instance.

Lampe à bouton via g avec virtualité :

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();
}

des exemples éculés.