Eigener Container



  • Hallo,
    Was haltet ihr davon? Kann/sollte man auf solch eine Weise einen Container entwerfen, der Intern einen stl container verwendet? Was fehlt für die Kompatibilität mit den Standardalgorithmen? Ich hatte mich schon einmal eingelesen in dieses Thema. Ist jetzt schon länger her und fast alles wieder weg. :(. Vielleicht hat einer einen guten Link oder Hinweiß.

    Danke,
    Martin

    typedef std::vector<morpheme_t> morphemes_t;
    
    class module_t : private morphemes_t
    {
    public:
    
      using morphemes_t::begin;
      using morphemes_t::end;
      using morphemes_t::rbegin;
      using morphemes_t::rend;
    
      module_t(const std::initializer_list<morpheme_t> &il)
        : morphemes_t(il)
      { }
    
      void add(const word_t &word, const codeword_t &codeword)
      {
        push_back(morpheme_t(word, codeword));
      }
    
      void remove(const word_t &word)
      {
        const std::function<bool(const morpheme_t&)> compare =
          [&word](const morpheme_t &morpheme){ return morpheme.word().compare(word); };
    
        auto it = std::find_if(begin(), end(), compare);
    
        if(it != end())
          {
    	(*it) = back();
    	pop_back();
          }
        else
          {
    	throw 1;
          }
      }
    };
    


  • Es gibt keinen Grund von STL-Containern zu erben!

    1. Du darfst keinen eigenen Destruktor hinzufügen, da der von std::vector nicht virtual ist, ergo bei einem delete auf den Basisklassenzeiger deiner nicht aufgerufen wird.
    2. Sind alle interessanten Internas private und nicht protected, dh. du kannst nix machen, was nicht auch mit einer freien Funktion möglich wäre.



  • Ethon schrieb:

    1. Du darfst keinen eigenen Destruktor hinzufügen, da der von std::vector nicht virtual ist, ergo bei einem delete auf den Basisklassenzeiger deiner nicht aufgerufen wird.

    Da der vector private ist, entfällt dieses Problem



  • Trotzdem zweifelhaftes Design.

    Verwendung("ist implementiert mit") in form von privater Ableitung wird üblicher weisse nur verwendet, wenn du auf protected Methoden der Ableitung draufmusst. Ansonsten ist Aggregation / Conjunction (member-Variable) immer der bessere Weg !

    Ciao ...


  • Mod

    RHBaum schrieb:

    Trotzdem zweifelhaftes Design.

    Verwendung("ist implementiert mit") in form von privater Ableitung wird üblicher weisse nur verwendet, wenn du auf protected Methoden der Ableitung draufmusst. Ansonsten ist Aggregation / Conjunction (member-Variable) immer der bessere Weg !

    Ciao ...

    Warum?

    Dem Grunde nach ist hier an der privaten Ableitung nichts auszusetzen. Ein paar mehr typedefs (value_type,iterator etc.) sollten allerdings mit exportiert werden.


Anmelden zum Antworten