System-Details hinter void* verstecken?



  • Hoi! 😉

    Ich würde gerne in meiner Library Systemdetails weiter verstecken, was vor allem Portabilität ermöglichen soll. Vor allem Systemheader will ich mit Gewalt aus den Header Files fernhalten und möglichst keine Präprozessorswitches im Interface haben.
    So habe ich mir ein Grundinterface zusammengebastelt, das jedes Betriebssystem implementieren könnte:

    namespace Detail
      {
        class MemoryRegionSnapshot
        {
        private:
          int m_pid;
          void* m_impl;
    
        public:
          MemoryRegionSnapshot(Pid procId);
          MemoryRegionSnapshot(MemoryRegionSnapshot const& other);
          MemoryRegionSnapshot(MemoryRegionSnapshot&& other);
          ~MemoryRegionSnapshot();
    
          MemoryRegionSnapshot& operator=(MemoryRegionSnapshot const& other);
          MemoryRegionSnapshot& operator=(MemoryRegionSnapshot&& other);
    
          MemoryRegion extractNextRegion();
          bool hasMoreRegions() const;
        };
      }
    

    Jetzt frage ich mich halt, ob das mit dem void* nicht recht schlechter C++ Stil wäre, mir geht es in der Library eben auch stark um gutes Design.

    Hinter dem void* würde sich in diesem spezifischem Fall unter Windows ein "echter" void-Pointer verbergen (von daher würde auch keine Typinformation verloren gehen, unter Linux wäre es ein FILE*/std::ifstream*, andere Systeme hab ich mir bis jetzt noch nicht angesehen.

    Guter/Schlechter Stil? Vorschläge es schöner zu machen?

    Danke! 😉
    Grüße,
    Ethon


  • Mod

    Ich glauube, du suchst das Pimpl-Idiom:
    Google: pimpl idiom c++



  • und selbst damit könntest du es per template machen, also sprich dir das void bzw. den fstream als templte parameter übergeben lassen



  • Skym0sh0 schrieb:

    und selbst damit könntest du es per template machen, also sprich dir das void bzw. den fstream als templte parameter übergeben lassen

    Aber gerade dann müsste ich doch die Implementierung offen legen und sämtliche Systemheader inkludieren + den Code mit Präprozessoranweisungemn verwursten.

    Ich glauube, du suchst das Pimpl-Idiom:
    Google: pimpl idiom c++

    Klingt brauchbar! 🙂

    Ich versuche zwar krampfhaft zu vermeiden, dynamisch Speicher zu allozieren, aber ich denke dass 1 new/delete nicht ins Gewicht fällt wenn mit jeder Instanz im Extremfall über 1000 Zeilen Text komplett geparsed werden müssen. 😉



  • Warum void* und nicht eine konventionelle polymorphe Basisklasse? Mit virtuellen Funktionen müsstest du auch nicht andauernd casten.


Anmelden zum Antworten