leere Klasse



  • Ich hab ne art Terminal:
    std::map speichert zeiger auf die abstrakte basisklasse cmd_base, sowie strings wie der Befehl heissen soll.
    Die Befehle sind dann abgeleitete klassen von cmd_base welche dann mit Hilfe von der eben genannten map ausgeführt werden... (geparster input im terminal ... bla )
    höchstwahrscheinlich benötigt kein Befehl datenmember - bis jetzt jedenfalls nicht.

    Ist das design nett oder habt ihr schon eure fackeln und mistgabeln vorbereitet? 🤡



  • Was bringt es dir, eine cmd-Klasse zu schreiben (welche noch dazu abgeleitet werden kann), um dann den eigentlichen Befehl in einer Map abzulegen? Ich würde doch den Befehl in die Klasse als Member packen.



  • QUESTIONATOR schrieb:

    Was bringt es dir, eine cmd-Klasse zu schreiben (welche noch dazu abgeleitet werden kann), um dann den eigentlichen Befehl in einer Map abzulegen? Ich würde doch den Befehl in die Klasse als Member packen.

    Ja ne ich hab halt meine Benutzereingabe, also Befehle samt Argumente.
    Nun muss ich den Befehl - einen string - mit code assoziieren. Daher kommt die map.

    Ich hab übrigens nicht Funktionszeiger sondern Klassen, weil jeder Befehl eine Funktion für
    Rückgabe der erforderlichen Anzahl an Argumenten (test für vorzeitigen Abbruch. Wenn nicht erfüllt wird der befehl erst gar nicht ausgeführt)
    Das Parsen von parametern
    Und das eigendliche Ausführen
    Sowie einen Infostring ins terminal zu schreiben
    - " - manpage - " -



  • Ok, jetzt weiß ich was du willst.
    Ich finde das Design recht einschränkend. Die Befehle sind ab Compile nicht erweiterbar/änderbar. Ein Fehler resultiert in einem Patch. Eleganter wäre es, wenn du die Befehle in einer eigenen "Sprache" in einer Datei ablegst, da brauchst du dann nur das Vezeichnis mit den Dateien indizieren und beim Aufruf die Datei Parsen. Du kannst dir das Leben leichter machen, wenn du schon eine fertige Scriptengine wie "lua" verwendest. Aber es wird so relativ schnell kompliziert, drum wenn dir diese Einschränkung passt, ist es wohl OK.

    Alternativ: deine Befehle stehen selber in Cpp-Dateien, die als Executable mit installiert werden. Es wird dann mittels system() aufgerufen...

    Des weiteren kann ein Befehl nie zweimal parallel gestartet werden. Denn in deiner Map liegen bereits die Befehls-Objekte. Leg doch Factory-Klassen da rein, oder factory-Funktionspointer. Bei jedem Aufruf wird ein neues Funktionsobjekt instanziiert und in eine Liste gelegt. Wenn es fertig ist wird es entfernt.
    Weiterer Vorteil: Falls ein Befehl mit einem Fehler endet, ist das cmd_Objekt nicht durch einen falschen State verseucht. Liese sich aber auch durch eine Funktion ala clear() beheben, die einen definierten Ausganspunkt für die nächste Ausführung herstellt.
    Solltest du aber immer nur ein einziges Terminal bereitstellen, also nie auch ein zweites, oder Parallele Ausführung im selben Terminal zulassen ist auch dieser Punkt nicht unbedingt ein Muss.



  • Also erstmal vielen Dank für die Tipps! Ich werde ein bisschen experimentieren! 🙂 🙂


Anmelden zum Antworten