class Console als Basis Klasse?



  • Du solltest ersteinmal eine vernünftige Aufteilung in Header und Source machen (pure Header-only nutzt man nur für template).

    Und warum sind die Funktionen onUserCreate und onUserUpdate pure-virtual, denn so ist die Klasse Console ja ohne Ableitung gar nicht nutzbar.
    M.E. solltest du besser mehrere Klassen daraus erzeugen: eine technische (Basis-)Klasse und eine Userklasse.

    Inhaltlich finde ich auch einige Dinge eigenartig, z.B. die Thread-Benutzung in start()...



  • @zeropage sagte in class Console als Basis Klasse?:

    Die abgeleitete Klasse wäre dann die Anwendung, die mit der Basis Klasse realisiert werden kann.

    Damit beschreibst Du alle Vererbungen.

    Generell auf Konsolen/Terminals bezogen würde ich eher ein Template vorschlagen das die Möglichkeiten verschiedener Implementierungen nutzt. So kann es eine Klasse für die Win32-Konsole geben, eine für ein VT100, eine die ncurses nutzt, oder auch eine abgespeckte Version die nur auf Files arbeitet. Vielleicht sind dafür auch sowas wie terminal_traits nützlich, wer weiß 😉



  • Schonmal danke für die Antworten. Einige Nachfragen habe ich doch noch.

    Was ist nicht gut an header-only? Ich finde das eher belastend, immer zwei Dateien im Überblick zu haben. Ich schließe aber aus dem Hinweis, es muß einen guten Grund dagegen geben?



  • Zum einen kann das Kompilieren um Größenordnungen länger dauern, vor allem natürlich, wenn der Header mehrfach eingebunden wird.
    Zum anderen ist es eigentlich schon nicht schlecht, eine Übersicht in Form eines Headers zu haben. Klar, braucht man nicht unbedingt, haben die meisten anderen Sprachen ja auch nicht. Aber ich finde es oft tatsächlich praktisch.



  • Ich will "Kompilieren um Größenordnungen" nicht runterreden, aber überzeugt mich nicht mehr, als das man auf die Größe des Arbeitsspeicher achten soll.

    Klar gibt es Codes, die auch an heutige Hardware-Grenzen stoßen, und ich habe auch schon Beispiele gesehen, wo eine .cpp notwendig gewesen ist,
    aber bei solchen Beispielen wie hier, hat das doch alles keine Bewandnis. Ich meine, es macht schon einen Unterschied, wie groß der Code ist. Das kann man nicht 1:1 beziehen.



  • @zeropage sagte in class Console als Basis Klasse?:

    Ich will "Kompilieren um Größenordnungen" nicht runterreden, aber überzeugt mich nicht mehr, als das man auf die Größe des Arbeitsspeicher achten soll.

    Klar gibt es Codes, die auch an heutige Hardware-Grenzen stoßen, und ich habe auch schon Beispiele gesehen, wo eine .cpp notwendig gewesen ist,
    aber bei solchen Beispielen wie hier, hat das doch alles keine Bewandnis. Ich meine, es macht schon einen Unterschied, wie groß der Code ist. Das kann man nicht 1:1 beziehen.

    Das hat nichts mit dem RAM zu tun. In jeder Datei in die der Header eingebunden wird, muss halt der komplette Header wieder komplett kompiliert werden. Je mehr Dateien das betrifft, desto schlimmer. Aus diesem Grund wurden dann auch Precompiled Header empfunden.

    Wenn das Ganze für dich soo "belastend" ist, dann solltest du Module aus c++20 verfolgen.



  • @zeropage: Weißt du denn, was inline bedeutet, s.a. Inline Functions (bes. die letzten Abschnitte solltest du lesen)?



  • @zeropage sagte in class Console als Basis Klasse?:

    Ich will "Kompilieren um Größenordnungen" nicht runterreden, aber überzeugt mich nicht mehr, als das man auf die Größe des Arbeitsspeicher achten soll.

    Spätestens wenn das Kompilieren eine Stunde dauert, wird dich alles überzeugen, was die Compilezeit deutlich verkürzt 🙂
    Spätestens wenn du nicht mehr kompilieren kannst, weil der RAM voll ist und der Compiler (oder Linker) die Arbeit verweigert, wirst du auf den RAM-Verbrauch achten.



  • @zeropage sagte in class Console als Basis Klasse?:

    toTstring

    Deine Console.toTString Funktion sieht fehlerhaft aus. Wenn du nämlich das Projekt auf Unicode umstellst, kopiert deine Funktion einen std::string direkt in einen std::wstring. Und das darf man nicht.

    #include <cstdio>
    #include <string>
    #include <iostream>
    
    #include <Windows.h>
    
    #ifndef UNICODE
    #error "Projekt bitte auf Unicode umstellen";
    #endif
    
    typedef std::basic_string<TCHAR> tstring;
    
    
    
    tstring toTstring(const std::string& str)
    {
    	tstring tstr;
    	for (const auto ch : str)
    		tstr.push_back(static_cast<TCHAR>(ch));
    
    	return tstr;
    }
    
    int main(int argc, char** argv)
    {
    	std::wstring Text = toTstring("Schäferstündchen in der Tüpfelhyänenöhrchenstraße");
    	std::wcout << Text;
    	return 0;
    }
    

    Prüfe ob du nicht komplett auf TCHAR oder Unicode umstellen kannst, oder nutze MultiByteToWideChar().



  • Danke für die Anregungen. Und tschuldigung für die späte Antwort.


Anmelden zum Antworten