Frage zu Konstruktor



  • Hallo,

    ich möchte eine Klasse schreiben, in der eine Member-Variable vom Typ Array[][], daher praktisch eine Matrix, abgelegt ist. Bis jetzt sieht es grob so aus:

    class Matrix
    {
    public:
        Matrix( unsigned int n, unsigned int m );   //Der Konstruktor
    private: 
        int matrix[][];
    }
    
    Matrix::Matrix( unsigned int n, unsigned int m )
    {
    int matrix_constr[n][m];
    matrix = matrix_constr;
    }
    

    Ich bin leider ein Java-geschädigter C++-Neuling. Man sieht, dass ich im Konstruktor der Matrix die Anzahl der Zeilen und Spalten zuordnen will. Dies funktioniert warum auch immer nicht. Ich habe es auch schon über pointer versucht, ohne Erfolg... Kann mir jemand helfen?

    (Und wie genau funktioniert die Darstellung mit dem Code in diesem Forum?)


  • Mod

    Rohe Arrays sind in C++ nicht zuweisbar. Was du machen müsstest, wäre einen Pointer nehmen und mit new den Speicher anfordern. Doch wer hätte das gedacht: Das gehört schon zur Standardbibliothek und nennt sich std::vector. Macht genau das was du da vor hast, nur viel ausgereifter.

    (Und wie genau funktioniert die Darstellung mit dem Code in diesem Forum?)

    Du musst das abschließende Tag mit / anfangen. Hier die genaue Anleitung, gilt für sehr viele Forensysteme:
    http://www.c-plusplus.net/forum/faq.php?mode=bbcode



  • Naja, ich muss die Klasse trotzdem selber schreiben, mit den zugehörigen Umständen 😉

    Wie genau würde es denn mit den Pointern funktionieren? Könntest du mir vielleicht ein kurzes Bsp. oder ähnliches geben?

    Trotzdem schonmal vielen Dank 🙂

    Mir ist grad nochwas aufgefallen:

    Der Copy-Constructor wird ja bei der Über- und Rückgabe eines Objekts benutzt. Im Inet habe ich innerhalb des Copy-Konstruktors aber nie ein "return" oder so gefunden. Woher weiss man denn, was jetzt genau dank des Copy-Konstruktors zurückgegeben wird?



  • Kladdi schrieb:

    Naja, ich muss die Klasse trotzdem selber schreiben, mit den zugehörigen Umständen 😉

    Warum musst du das? Für die Schule/Uni?

    Kladdi schrieb:

    Wie genau würde es denn mit den Pointern funktionieren? Könntest du mir vielleicht ein kurzes Bsp. oder ähnliches geben?

    Wenn du dich mit Zeigern noch nicht auskennst, wird dein Container zu viele Bugs haben, fürchte ich. Kopierkonstruktor, Zuweisungsoperator und Destruktor mit Speicherverwaltung sauber zu implementieren, fällt sogar vielen Fortgeschrittenen schwer.

    Aber als Einführung solltest du dir das Kapitel deines C++-Buchs und z.B. diesen Artikel anschauen.



  • Kladdi schrieb:

    Der Copy-Constructor wird ja bei der Über- und Rückgabe eines Objekts benutzt.

    Ich glaube, du verstehst das etwas falsch. Der Kopierkonstruktor wird immer benutzt, wenn eine Kopie eines Objekts erstellt wird. Das mag zwar bei Funktionübergaben und -rückgaben teilweise der Fall sein, aber es kann auch in anderen Kontexten vorkommen. Beispielsweise

    Typ a;
    Typ b = a;
    

    Und daher muss ein Kopierkonstruktor auch nichts zurückgeben. Er muss nur das Objekt ordentlich initialisieren, sodass es nach dem Aufruf eine Kopie des Arguments darstellt.



  • Ich mach's für die Uni.

    Ok, das hat gerade einige Fragen zum CK beantwortet. Der Link ist übrigens sehr gut, Danke noch einmal dafür!

    ...
    protected:
        int **matrix;
    
    };
    
    Matrix::Matrix( unsigned int n, unsigned int m )
    {
    
        if((n<=0) || (m<=0))
        {
            cout << "Dimensionen sind negativ!";
            exit(EXIT_FAILURE);
        }
    
        matrix = new int*[n];                              //Zeilen allokieren
    
        for (size_t i=0;i<n;++i)
            *(matrix+i) = new int[m];                      //Spalten allokieren
    
    }
    

    Was haltet ihr davon?



  • Kladdi schrieb:

    Was haltet ihr davon?

    Wenig.
    unsigned kann nicht negativ sein, also ist der Test unnötig.

    Meistens ist es auch sinnvoller ein 2dimensionales Array nicht unbedingt als 2 dimensionen zu behandeln sondern an einem Stück zu allokieren. Du kannst ja statt array[x][y] auch einfach array[X_DIMENSION*y+x] machen.



  • Hatte ich mir auch überlegt, aber ein zweidimensionales Array erschien mir "edler". Aber ich sehe schon, für einen Anfänger wie mich ist es vielleicht nicht sehr sinnvoll dieses Array wie oben zu gestalten.



  • Kladdi schrieb:

    Hatte ich mir auch überlegt, aber ein zweidimensionales Array erschien mir "edler".

    Du meinst fehleranfälliger und ineffizienter. Ja, edler könnte man es auch nennen. 😃



  • class Matrix
    {
    
    public:
        Matrix( unsigned int n, unsigned int m );
        Matrix( const Matrix& m );
        ~Matrix();
    
    protected:
        int *matrix;
        int rows;
        int columns;
    
    };
    
    Matrix::Matrix( unsigned int n, unsigned int m )
    {
        rows = n;
        columns = m;
        matrix = new int[n*m];
    }
    
    int main(int argc, char *argv[])
    {
    
        Matrix test = new Matrix(2,2);
    
    return 0;
    
    }
    

    Sieht das besser aus? Es funktioniert leider noch nicht weil der Ausdruck in der main nicht will (conversion from 'Matrix*' to non scalar type 'Matrix' requested). Was hab ich jetzt schon wieder falsch gemacht?



  • Matrix* test = new Matrix(2,2);
    

    :p



  • Benutze bitte [cpp]-Tags, nicht [code]-Tags. Anmerkungen als Kommentare im Code:

    class Matrix
    {
    public:
        Matrix( unsigned int n, unsigned int m );
        Matrix( const Matrix& m );
        ~Matrix();
        // Zuweisungsoperator fehlt
    
    protected: // Nimm private
        int *matrix;
        int rows;
        int columns;
    };
    
    Matrix::Matrix( unsigned int n, unsigned int m )
    {
        // Benutze dafür die Konstruktor-Initialisierungsliste!
        rows = n;
        columns = m;
        matrix = new int[n*m];
    }
    
    int main(int argc, char *argv[])
    {
        // Warum Java? C++ wäre:
        // Matrix test(2, 2);
        Matrix test = new Matrix(2,2);
    }
    

    Kladdi schrieb:

    Was hab ich jetzt schon wieder falsch gemacht?

    Du solltest dir wirklich anschauen, was Zeiger sind und was new bzw. delete tun. Genauso, dass es in C++ nicht nur dynamische Speicherverwaltung gibt. Sonst kommst du nirgendwohin.



  • Was? Also in guter Java-Manier würde das doch funktionieren 😉
    Kannst du mir erkären warum ich hier mit Pointern arbeiten muss?

    €: bezieht sich auf dweb



  • Kladdi schrieb:

    Was? Also in guter Java-Manier würde das doch funktionieren 😉

    Was rein gar nichts zur Sache tut. Aber schau dir meinen letzten Abschnitt des vorherigen Posts an.



  • Was meinst du mit Zuweisungsoperator? "=" ?

    const Matrix& operator = ( const Matrix& m );

    ...würde dann fehlen.



  • Kladdi schrieb:

    Was meinst du mit Zuweisungsoperator?

    Ui, da fehlen ja wirklich viele Grundlagenkenntnisse. Das ist nicht böse gemeint, aber es macht wirklich mehr Sinn, wenn du C++ von Grund auf neu lernst, statt von Java umlernst. Vieles bleibt zwar gleich (v.a. prozedurale Dinge), aber bei OOP und Objekten sind die Gemeinsamkeiten nur oberflächlich.

    Hast du überhaupt ein C++-Buch, mit dem du dir die Sprache beibringst? Falls nicht, besorge dir z.B. den C++ Primer oder Thinking in C++ (auch gratis als Online-PDF). Aber z.B. mit Online-Tutorials alleine erreichst du nicht viel.



  • Naja, ich hatte eine 45-minütige Einführung in C++ und die Hoffnung, dass ich dank Python und Java die Sprache schnell verstehen werde. Ich schau mir mal Thinking in C++ an. Danke!



  • Kladdi schrieb:

    Naja, ich hatte eine 45-minütige Einführung in C++

    Und du hast im Ernst gedacht, das würde reichen? 😮

    C++ ist eine sehr komplexe Sprache. Du brauchst Monate, bis du darin einigermassen vernünftig programmieren kannst. Und Jahre, um C++ wirklich gut zu beherrschen.

    Du kannst natürlich auch versuchen, dir diese Zeit zu "sparen". Aber das klappt meistens nicht, weil man doch dauernd mit Wissenslücken konfrontiert wird, die einem unnötige Zeit rauben. Also empfehle ich dir, gleich richtig anzufangen. 😉



  • Tja, dann wird wohl jeder Besucher der Vorlesung durchfallen... Ich melde mich wieder wenn ich endlich einigermaßen weiss was ich hier mache.



  • Und du hast im Ernst gedacht, das würde reichen? 😮

    C++ ist eine sehr komplexe Sprache. Du brauchst Monate, bis du darin einigermassen vernünftig programmieren kannst. Und Jahre, um C++ wirklich gut zu beherrschen.

    Du kannst natürlich auch versuchen, dir diese Zeit zu "sparen". Aber das klappt meistens nicht, weil man doch dauernd mit Wissenslücken konfrontiert wird, die einem unnötige Zeit rauben. Also empfehle ich dir, gleich richtig anzufangen. 😉

    Danke noch einmal für diesen Kommentar. Ich hatte mir nun überlegt, dass ich eventuell die Veranstaltung, für die ich C++ benötige, komplett fallen lasse uns stattdessen mich mit einem gescheiten Buch auseinandersetze. Ich hatte dabei an "Einführung in die Programmierung mit C++" vom C++ Erfinder Stroustrup gedacht. Ist das Buch OK? Andere Empfehlungen?


Anmelden zum Antworten