Vererbung oder Templates?



  • Hallo zusammen, ich bin ein relativer Neuling in C++ und würde gerne wissen was erfahrernere Leute zu meinem aktuellen Problem meinen (und wie man das problem vielleicht konziser formulieren könnte -> recherche..)

    Ich habe eine Klasse Netzwerk die im wesentlichen einen (gerichteten, gewichteten)Graphen, also vertices (n Stück )und kanten (n x n) abbilden soll. Dazu kommen noch Schnittstellen es zu manipulieren.
    Nun gibt es verschiedene Typen von Netzwerken die intern mit Boolschen werten , Integern oder Gleitkommazahlen arbeiten, die Schnittstellen bleiben aber im wesentlichen gleich.

    Mit Templates hab ich das Problem ich nicht für jeden Typ die gleichen (member)Variablen und Funktionen brauche. Mit Vererbung habe ich das Problem dass ich Funktionen nicht mit verschiedenen Rückgabewerten überschreiben kann.

    Kennt wer von euch Problemstellungen dieser Art und Lösungsmuster dazu? Eine Zeitlang dachte ich mir policy classes könnte ich dem bekommen,hatte aber bisher keinen erfolg..



  • Templates mit Template-Spezialisierung.



  • Templates.
    Mir scheint keine gemeinsame Basisklasse sinnvoll zu sein. Welche Bedeutung hätte die?

    Mit policy classes wird es klappen. Oder mit SFINAE. Was davon häßlicher ist, hängt vom Einzelfall ab.



  • M10n schrieb:

    Nun gibt es verschiedene Typen von Netzwerken die intern mit Boolschen werten , Integern oder Gleitkommazahlen arbeiten, die Schnittstellen bleiben aber im wesentlichen gleich.

    Warum bleiben sie nicht ganz gleich?



  • volkard schrieb:

    Warum bleiben sie nicht ganz gleich?

    Ich tippe auf Design-Fehler.



  • EOutOfResources schrieb:

    volkard schrieb:

    Warum bleiben sie nicht ganz gleich?

    Ich tippe auf Design-Fehler.

    Nun , das kann ich noch nciht ganz ausschließen. Die Algorithmen die auf einem Netzwerk<float> angewandt werden beinhalten eine zusätzliche Funktion setEdgeValue(float val, int edge), während die Boolsch variante nur invertEdge(int edge) hat( jetzt nicht am namen aufhängen, toggleEdge(..) ist wahrscheinlich besser.. setzt halt die wichtung von true auf false und umgekehrt),was bei floats keinen sinn macht.



  • Könnte invertEdge() nicht auch für float -Graphen verwendet werden und einfach das Kantengewicht negieren?

    Ansonsten, wenn es zwei verschiedene Funktionalitäten sind, musst du sie nicht vereinen. In welchem Kontext willst du beide Funktionen überhaupt einheitlich ansprechen?



  • also ein gemeinsames

    T& edgeValue();
    

    und die Benutzung beim bool ist

    bla.edgeValue()=!bla.edgeValue();
    

    und

    bla.edgeValue()=val;
    

    oder sowas. Und Graf kann Graf bleiben, ohne zu wissen, was drin ist.
    edit:

    toggle(bla.edgeValue());
    

    mit

    void toggle(bool& b);
    


  • Nexus schrieb:

    In welchem Kontext willst du beide Funktionen überhaupt einheitlich ansprechen?

    Nun, bei DEN Funktionen wird sich auch der Kontext an der Stelle ändern müssen, aber eben nur da. Der Rest kann übernommen werden , so dann man zumindest mal aussagen treffen kann in wiefern sich die leistungsfähigkeit der Netze ändern kann (je nach implementierungstyp)



  • Vielen Dank Leute, fürs erste funktionierts..(templates und eben spezialisierung für die einzelnen typen. ) für weitere Designfragen lieber n neuen Thread oder hier?



  • M10n schrieb:

    für weitere Designfragen lieber n neuen Thread oder hier?

    Wenns weiter um diese Graphen-Klassen und ihre Implementierung als Template geht, dann hier.
    Wenns ein anderes Thema ist, dann nen neuen Thread.


Anmelden zum Antworten