Compilerfehler mit Template-Parameter = void* - Seite 19

 
pavlick_:

Selbstzerstörung? - das ist neu :).

Ja, Selbstzerstörung. Ich nehme an, Sie wissen, dass dies der Unterschied zwischen "Stack"-Objekten und dynamischen Objekten ist - sie fragen Sie nicht, wann sie sich selbst löschen sollen, sondern tun dies, wenn sie den ursprünglichen Programmblock verlassen :)
 
Ilya Malev:
Jepp, Selbstzerstörung. Ich nehme an, Sie wissen, dass dies der Unterschied zwischen "Stack"-Objekten und dynamischen Objekten ist - sie fragen Sie nicht, wann sie sich selbst löschen sollen, sondern tun dies, wenn sie den ursprünglichen Programmblock verlassen :)

Sie haben wahrscheinlich schon von den Konstruktoren/Operatoren zum Kopieren und Verschieben gehört, oder?

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

Sie haben wahrscheinlich schon von den Konstruktoren/Operatoren zum Kopieren und Verschieben gehört, oder?

Wir halten also Ausschau nach dem entscheidenden Moment und kopieren ihn auf diese Weise, wenn wir nur nicht zu spät kommen? :lol:

Nur weil wir OOP nicht mögen, oder gibt es andere Hintergedanken?

 
Ilya Malev:

Wir halten also Ausschau nach dem entscheidenden Moment und kopieren ihn auf diese Weise, wenn wir nur nicht zu spät kommen? :lol:

Nur weil wir OOP nicht mögen, oder gibt es andere Hintergedanken?

Natürlich, wie sollte es auch anders sein? Als anständiger Progger müssen Sie dynamische Objekte auch über Stacks verwalten (RAII-Technik)

{
   unique_ptr<Class> p(new Class);
   ...
   // ой, самоуничтожение :)
}
 
Und, verdammt, wir werden eine Menge Wrapper dafür bauen. Denn die Nische des Polymorphismus ist nicht so bedeutend, aber unsere Krücken haben ein ganzes Anwendungsfeld, wenn wir nicht OOP verwenden :cry:
 
pavlick_:

Natürlich, wie sollte es auch anders sein? Als anständiger Proger müssen Sie dynamische Objekte auch über Stack-Objekte verwalten (RAII-Technik).

Meinen Sie die Müllabfuhr? )))) oder über das Zählen der Anzahl von Referenzen. Ich habe diese Dinge in letzter Zeit geübt. Aber leider ist die Leistung all dieser Ansätze in µl sehr schlecht

 
Die Verwaltung von din.objects über stack ones bedeutet, dass für jedes Objekt ZUSÄTZLICH 24 Bytes Speicher zugewiesen werden müssen (so viel wiegt ein solcher "Stapelzeiger "+Verweis auf das Objekt selbst). Außerdem ist der Zeitaufwand in Bezug auf die Geschwindigkeit nicht unerheblich. All dies ist im Großen und Ganzen ziemlich traurig. Aber wir haben auch nicht das Gefühl, dass wir ein großes Bedürfnis danach haben. Wie man sagt, hat die Angst viele Augen. Wenn wir Raumstationen programmieren, dann geht es nicht ohne strenge Kontrolle. Aber mit einem fein abgestimmten Klassensystem geht es auch ohne.
 

Nein, nicht über Müllsammler, sondern über intelligente Zeiger - unique_ptr, shared_ptr (mit Referenzzählung), RAII leicht gegoogelt. Im Allgemeinen gibt es keine zusätzlichen Kosten für unique_ptr in Bezug auf Speicher (Wrapper == Zeigergröße), und Anrufe sind über-optimiert, aber in µl alles ist traurig, ja. Aber das ist hier auch nicht nötig (intelligente Zeiger).

 
pavlick_:

Oder Sie könnten die Vorlagen nehmen und etwas schreiben wie:

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

Button ist auch detailunabhängig, ohne die ganze Polymorphie und die Schnittstellen. Der Polymorphismus hat seine eigene Nische, die aber viel enger ist, als sie sagen.

In diesem vereinfachten Beispiel sieht die Vorlage sicherlich besser aus. Eigentlich brauchen Sie dort nicht einmal eine Vorlage, da Sie nur eine Instanz haben.

 
Alexey Navoykov:

Dieses vereinfachte Beispiel lässt die Vorlage sicherlich praktischer erscheinen. Eigentlich brauchen Sie dort nicht einmal eine Vorlage, da Sie nur eine Instanz haben.

Knopfleuchte über g mit Virtualität:

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

abgedroschene Beispiele.