gleiche Funktionen in mehreren Klassen vermeiden.



  • Hi, ich habe mehrere Klassen, nun habe ich in jeder Klasse eine Funktion die gleich ist.

    class test_a
    {
    private:
      struct Punkt
      {
        double x,y,z,nx,ny,nz;
        ....
      };
      ....
      double dist(Punkt a, Punkt b); //berechnet den Abstand 2er Punkte
      ...
    }
    
    class test_b
    {
    private:
      struct Punkt
      {
        double x,y,z,nx,ny,nz;
        ....
      };
      ....
      double dist(Punkt a, Punkt b); //berechnet den Abstand 2er Punkte
      ...
    }
    

    Das sich die Funktionen nun auf die Klassen beziehen, und nur in ihnen aufgerufen werden sollen, wollte ich fragen wie
    ich eleganter machen kann, ohne den Quelltext in jeder Klasse neu einzufügen.

    Danke



  • a) wieso ist "Punkt" in jede einzelne Klasse gekapselt.

    auf den ersten Blick würde ich sagen: Punkt global zugänglich machen, dist(Punkt, Punkt) als globale Helper-Funktion 8evtl. in einen namespace)



  • Hallo,

    oder vielleicht Punkt zu einer Klasse machen mit dist als Memberfunktion.

    Ciao



  • Hallo,
    naja, mit globalen Daten is das so'ne Sache. Ich sehe mindestens 2 Möglichkeiten:

    1.) Bau ne Oberklasse, die z.B. die Abstandsberechnung beinhaltet und leite Deine Klassen davon ab.

    2.) Bau ne "Berechnungsklasse", wo die Abstandsberechnung drin ist. Diese könnte später weitere Berechnungen beinhalten. Deine Klassen besitzen dann entweder einen Zeiger oder eine Instanz der Klasse. Vielleicht könnte man die Berechnungsklasse auch Singleton deklarieren.

    Es gibt soviele Möglichkeiten... 🙂



  • Ok, ich versuche mal mich etwas genauer zu formulieren.

    Ich habe die Struktur Punkt und die Funktion dist, beide hängen zusammen.
    Ich will es nun so gestalten, daß nur bestimmte Funktionen darauf zugreifen können. (also lokale Abwicklung)

    Mich hat nun nur gestört, daß ich in jeder Klasse, in der ich das haben wollte, den Quelltext neuschreiben mußte.
    An einer eigenen Klasse stört mich, daß jeder davon erben kann.



  • An einer eigenen Klasse stört mich, daß jeder davon erben kann.

    ooch, ist ja auch so schlimm 🙄 🙄 🙄 🙄



  • An einer eigenen Klasse stört mich, daß jeder davon erben kann.
    

    Rofl, aehm naja :p dann mach den Destruktor ned virtuell ... und die abtruennigen Ableiter erleben ihr blaues wunder 😃

    Ich habe die Struktur Punkt und die Funktion dist, beide hängen zusammen.

    Da Du die Abhaengigkeit logisch ned loesen kannst, ists auch ned so schlimm, wenn da ne programmtechnische Abhaengigkeit hast ....

    daß ich in jeder Klasse, in der ich das haben wollte, den Quelltext neuschreiben mußte

    Jo, und das ist schlimm !

    In C++ gibts mehrere Moeglichkeiten, Code "Wiederzuverwenden"

    Auf "laufzeitebene" Aggregation und Inheritance.
    Auf "Compiler-ebene" Templates

    Aggregation:
    - Mach Punkt zu ner klasse, und gib der ne Membermethode, die die distanz zu nem anderen Punkt ausrechnet ... Ich denk mal die formel ist immer gueltig, also sollte sie auch logisch zu jedem punkt gehoeren.
    - oder schreib, wie Cosmixx vorgeschlagen, ne Berechnungsklasse, und instanzier die klasse, sobald ne berchnung fuer brauchst. die berechnungsklasse muss ja keine member selber haben.

    Inheritance:
    Mit basisklasse, die die berechnung haelt.
    lohnt sich aber eignetlich nur, wenn die berechnung sich auch mal aendert, ansonsten bekommst die nachteile von vererbung ohne nen vorteil fuer zu bekommen.

    Templates:
    wenn sich die berechnungsfunktion aendert und du dir den overhaed von virtuellen funktionen ned leisten kannst/willst, schau dir Policies an ...

    Mein Favourit waer die memberfunktion am Punkt ! Die hat, was ich so ueberblicken kann, keinerlei nachteile, da sich die funktion ja selber ned anedert, oder ?

    Globale funktionen hab ich mal rausgelassen ... Punkt als flat typ lassen und ne berechnungsfunktion fuer in nem passenden namespace ist sicher auch ne praktikable loesung, aber ned so mein geschmack ...

    Ciao ...



  • Wenn du's wirklich erzwingeln willst, mach doch den Punkt Konstruktor pirvate, und test_a und test_b zu friends. Mann kann nicht ableiten, und nur die entsprechenden Friend-Klassen können drauf zugreifen

    Ich halt' mich mit solchen sachen eher an Cline:

    // final - If you inherit from this class, we'll fire you
    class CPunkt
    {
    };
    


  • Ahh, das habe ich gesucht.
    Danke 🙂


Anmelden zum Antworten