einfache Matrizenklasse 2. Versuch



  • Beim ersten Drübergucken:

    • element sollte keine Kopie zurückgeben, sondern eine Referenz auf einen const float. Mag bei float nicht so schlimm sein, aber wenn du Schlangenmenschs Vorschlag berücksichtigst und aus der Klasse ein template machst kannst du im Vorfeld nicht wissen, wie teuer ein Kopie eines Elements wird.
    • alle binären Operatoren sollten freie Funktionen sein
    • warum ist die Einheitsmatrix eine eigene Klasse? Das ist vom Typ her genau das gleiche wie eine normale Matrix, nur dass die Elemente bestimmte Werte haben. Das würde ich über eine freie Funktion realisieren, die eine Matrix der entsprechenden Größe erzeugt und die Elemente initialisiert. Das Gleiche gilt für deine anderen Matrixtypen. Das ist in etwa so, als würdest du eine Basisklasse "Auto" bauen und rote, grüne und blaue Autos davon ableiten.
    • print sollte kein Member sein, sondern eine freie Funktion
    • du könntest den float & operator( int,int ) (+const Variante)für den Elementzugriff implementieren, dann haste die Möglichkeit so
    Matrix m( 3,3 );
    m( 0,0 ) = 1.0f;
    

    auf die Elemente der Matrix zuzugreifen



  • Mir sind das zu viele Klassen!

    Wenn ich gleichzeitig rotieren und skalieren will, brauche ich dann eine weitere neue Klasse? Mir scheint, dass du eigentlich eher Funktionen brauchst, die dir bestimmte Matrizen erzeugen, wie auch @SeppJ schon sagte.

    @zeropage sagte in einfache Matrizenklasse 2. Versuch:

    class Point : public Matrix

    Hier hast du mich wirklich verloren. Ein Punkt ist eine Matrix?

    Und noch viele andere Dinge, UnitMat hat 3 Konstruktoren. Sind die wirklich alle sinnvoll? Insbesondere, wenn der Parameter dv überhaupt nicht verwendet wird? Du möchtest da diagonalValues haben. Kannst du auch per Default-Parameter lösen. Aber die gesamte Klasse - warum ist das bei dir eine eigene, von Matrix erbende Klasse? Was gewinnst du dadurch? Die besonderen Eigenschaften werden nirgends ausgenutzt, z.B. indem man nur die Diagonalelemente speichert (ich schrieb das schon zuvor).

    Warum soll man bei dir eine Matrix mit dem Default-Konstruktor erstellen können?

    Warum gibt es kein virtual ~Matrix() = default;? Willst du die Klassen überhaupt virtuell verwenden?



  • @wob sagte in einfache Matrizenklasse 2. Versuch:

    Insbesondere, wenn der Parameter dv überhaupt nicht verwendet wird?

    Was für ein verdammter Parameter?



  • @zeropage sagte in einfache Matrizenklasse 2. Versuch:

    @wob sagte in einfache Matrizenklasse 2. Versuch:

    Insbesondere, wenn der Parameter dv überhaupt nicht verwendet wird?

    Was für ein verdammter Parameter?

    Der hier aus deiner Klasse UnitMat:

    class UnitMat : public Matrix
    {
    public:
    	UnitMat() : Matrix(3, 3) { construct(3); } 
    
    	UnitMat(const std::size_t size) :                 Matrix(size, size) { construct(size); }
            // **************************** guckst du hier ***
            // **************************** ↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ***
    	UnitMat(const std::size_t size, const float dv) : Matrix(size, size) { construct(size); }
    


  • Öh, tatsache. Da ist der Konstruktor noch übrig geblieben. Zum Glück wird der aber nicht mehr verwendet, trotzdem schon ulkig.

    Wieso ist Point : public Matrix eigenartig? Der Point ist in diesem Fall doch eine Matrix(1, 3)?


  • Mod

    @zeropage sagte in einfache Matrizenklasse 2. Versuch:

    Wieso ist Point : public Matrix eigenartig? Der Point ist in diesem Fall doch eine Matrix(1, 3)?

    Nein, ein Vektor wäre eine Sonderform einer Matrix, ein Punkt nicht.

    PS: Das ist dann auch eine sinnvolle Anwendung von Vererbung, da das Konzept eines euklidischen Vektors alle Eigenschaften einer 1xN-Matrix hat, man aber üblicherweise noch einige zusätzliche Eigenschaften und Operationen für diese definiert. Wäre hier aber dennoch etwas unhandlich, weil dann komische Sachen bei Nutzung von Matrizen auftauchen, wenn diese sich plötzlich spontan in Vektoren verwandeln können.

    Zu den anderen Arten, wie du Vererbung benutzt, wurde im letzten und diesen Thread schon genug gesagt.



  • Und das das Ding genauso läuft, wofür es geschrieben wurde, zählt gar nicht?

    Oder habe ich da irgendwas drin, analog zu system("PAUSE")?



  • @Swordfish sagte in einfache Matrizenklasse, Vererbung:

    @zeropage sagte in einfache Matrizenklasse, Vererbung:

    Und auch der theoretische Kram sollte mich nicht interessieren. Hauptsache,

    Finnegans Post sollte Dich in Hinblick auf gutes Design sehr wohl interessieren!



  • @zeropage sagte in einfache Matrizenklasse 2. Versuch:

    Und das das Ding genauso läuft, wofür es geschrieben wurde, zählt gar nicht?

    Nur bedingt. In komplexeren Projekten fällt dir sowas sehr schnell auf die Füße, also warum falsch angewöhnen?



  • @zeropage sagte in einfache Matrizenklasse 2. Versuch:

    Und das das Ding genauso läuft, wofür es geschrieben wurde, zählt gar nicht?

    Oder habe ich da irgendwas drin, analog zu system("PAUSE")?

    Es funktioniert aber halt leider nicht alles, was man damit machen kann, so wie du es dir vorstellst. Wenn du zum Beispiel einen std::vector<Matrix*> hast und da unterschiedliche abgeleitete Matrix Typen drin hast, wie zerstörst du die dann? Soweit ich weiß ist das dann sogar undefined behavior und damit schlimmer als system("PAUSE").


Anmelden zum Antworten