Programmdesign



  • Hallo Leute, ich habe 3 Fragen bezüglich meines Programmdesigns:

    1. Frage:
    Ich habe eine Exceptionklasse, welche dummerweise eine instanz einer Klasse beinhaltet, welche selbst eine Exception auslösen könnte.

    Pseudocode

    class String{
    public:
     String(void){
      throw Exception();
     }
    };
    
    class Exception{
    private:
     String str;
    };
    

    Was würde wohl passieren, wenn die String - Instanz in einer Exception - Instanz eine Exception wirft. Eine Endlosschleife?
    Wie kann man dieses Problem lösen?

    2. Frage:
    Alle meine Klassen sind von einer Basisklasse abgeleitet. Doch nun benötigt die Basisklasse eine Instanz aus einer Klasse, welche erst noch abgeleitet werden muss.

    Pseudocode

    class BaseClass{
    private:
     String str;
    };
    
    class String:public BaseClass{
    };
    

    Wie kann man dieses Problem lösen?

    3. Frage:
    Ich habe eine Klasse List welche Instanzen der Klasse BaseClass sowie allen abgeleiteten Klassen speichert. Nun möchte ich eine Instanz der Klasse List, welche nur Instanzen der Klasse String entgegennimmt, welche von BaseClass abgeleitet ist.

    Pseudocode

    class List{
    public:
     void add(const BaseClass *pCls);
    }
    
    class StringList{
    private:
     List lst;
    public:
     void add(const String *pStr){
      this->lst.add(pStr);
     }
    };
    

    Gibt es denn keine intelligentere Methoden zur Typfilterung zur Laufzeit?

    Einen lieben Gruss Ishildur



    1. Nein, das gibt keine Endlosschleife. Wenn eine Exception gerade aktiv ist und noch eine geworfen wird, dann wird Dein Programm einfach abgeschossen. Sowas zu bauen ist also schlicht falsch.

    2. Alles von einer Klasse erben zu lassen ist sehr ungeschickt. Versuch doch mal vernünftig zu beschreiben was ein String ist in diesem Design:

    Ein String ist ein BaseClass, welches dann wiederum aus einem String besteht welches wiederum eine BaseClass ist die wiederum einen String enthält... etc.

    Das kann so nicht funktionieren. Und wenn Du auf Pointer umstellst kriegste ne Endlosrekursion beim anlegen. Laß es sein.

    1. Die beste Filtermöglichkeit ist die Sachen einfach nicht in eine Liste reinzuschmeißen. Warum sollte man das tun, wenn die Objekt eigentlich garnichts miteinander gemeinsam haben?

    MfG Jester



  • @Jester
    2. Das Problem ist, dass die Klasse BaseClass Informationen enthält, welche ich für Reflections benötige und jede Klasse enthalten muss, ob dies nun ungeschickt ist oder nicht. Schade, dass C++ das nicht von Haus aus unterstützt.

    3. Ich schätze mal, du hast mich nicht richtig verstanden. Ich möchte eine Listeninstanz haben, welcher z.B. ausschliesslich Instanzen der Klasse Image übergeben werden könnnen, sowie eine Liste, welcher ausschliesslich Instanzen der Klasse Sound übergeben werden können.
    In meinem inneren Ohr höhre ich bereits das Wort Templates. Auf diese möchte ich allerdings verzichten, da dadurch die dll extrem aufgebläht werden würde. Denn dann habe ich genau denselben Code der Liste einfach für jeden implementierten Datentyp in der Dll


Anmelden zum Antworten