Designfrage für eine Gruppen Klasse und seiner Elemente.



  • Ich schreibe momentan eine Gruppen Klasse.
    Die Elemente müssen jeweils wissen zu welcher Gruppe sie gehören,
    ferner müssen sie Methoden der Gruppe benutzen.
    Ich habe mir dazu einen Ansatz überlegt und folgendes Problem erhalten:

    class Group {
    public:
      Group();
      void add(const Element& element);
      // ...und mehr Funktionen, ohne Relevanz für das Problem.
    private:
      std::vector<Element*> elements_; // Hierzu gleich noch fragen.
    };
    
    class Element {
    public:
      Element(const Group& group);
      void setGroup(const Group& group);
      //... wieder mehr Funktionen, wie oben, ohne Relevanz zum Problem.
    private:
      Group* group; // Auch hier wieder fragen.
    };
    

    Schon geht es los mit den Problemen und Unklarheiten.

    1. Ich arbeite in beiden Fällen mit Zeigern, was passiert, wenn z.B. die Gruppe
    vor dem Element den Destruktor aufruft und zerstört ist? Eine Verwendung der
    Gruppe in einer Methode des Elementes würde doch zu undefiniertem Verhalten
    führen (Der Speicherbereich gehört nicht mehr zum Programm). Gibt es dafür
    eine bessere Lösung?

    2. Gibt es für dieses Problem eine bevorzugte Methode, um dem Benutzer der
    Klassen eine möglichst einfache Benutzung zu gewähren?

    Über Anregungen und Lösungsmöglichkeiten würde ich mich freuen.



  • was das ganz werden soll ist mir nicht wirklich klar. kann es element ohne gruppe geben?



  • 1. Einfach alle Elemente mitlöschen, du kennst sie doch.
    2. Ziemlich sicher ja.



  • Der Sinn des ganzen ist folgender:
    Die Elemente der Gruppe haben verschiedene Attribute, diese sind abhängig davon, ob ein Element der Gruppe eine bestimmte Methode benutzt hat oder nicht.

    Ein Anwendungsbeispiel dafür wäre z.B. eine RadioButtonGroup, welche nur die Aktivierung eines Elementes zulässt.

    Ich würde mich über kurze Code Beispiele freuen.



  • vlt sowas wie observer pattern verwenden. die elemente können sich bei der gruppe registrieren und werden dann über ereignisse informiert. wenn ein elem gelöscht wird, wird es wieder deregistriert.


Log in to reply