Matrixklasse -- operator[]



  • Hallo Leute,

    ich schreibe im Moment an einer Matrixklasse. Ich will es irgentwie einrichten, dass ich mit Matrix[line][column] auf ein einzelnes Element der Matrix zugreifen kann. Wie kann ich das machen, bzw. welchen Operator muss ich dafür überschreiben?

    Mfg cpt.hawk



  • Den normalen operator[size_t idx], wuerd ich vermuten. Der muss dann halt was zurueckliefern, das wieder indizierbar ist, z. B. ein Array oder einen Vector oder einen Proxy auf deine interne Datenstruktur.



  • #include <iostream>
    
    using namespace std;
    
    template<typename T,size_t SIZEY,size_t SIZEX>
    class Matrix
    {
        private:
        T data[SIZEY][SIZEX];
        public:
        struct AccessProxy
        {
            Matrix* m;
            size_t y;
            AccessProxy(Matrix *m,size_t y)
            :m(m),y(y)
            {
            }
            T& operator[](size_t x)
            {
                return m->data[y][x];
            }
        };
        AccessProxy operator[](size_t y)
        {
            return AccessProxy(this,y);
        }
    };
    
    int main()
    {
        Matrix<int,3,4> m;
        for(int y=0;y!=3;++y)
            for(int x=0;x<=4;++x)
                m[y][x]=x*y;
        for(int y=0;y!=3;++y)
        {
            for(int x=0;x<=4;++x)
                cout<<m[y][x]<<'\t';
            cout<<'\n';
        }
        return 0;
    }
    


  • Danke für die Hilfe. Ich habs aber jetzt anders gelöst und zwar mit dem ()-operator.

    Jetzt aber eine andere Frage:

    Ich krieg nen Fehler, den ich mir nicht erklären kann.

    template<typename T>
    class Matrix{
    
    	private:
    	int l;
    	int c;
    	T **matrix;
    
    	public:
    	Matrix(int lines = 5, int columns = 5);
    	Matrix(const Matrix<T>& m);
    	~Matrix();
    
    	Matrix<T>& operator=(const Matrix<T>& m);
    	Matrix<T>& operator+=(const Matrix<T>& m);
    	Matrix<T>& operator-=(const Matrix<T>& m);
    	Matrix<T>& operator*=(const Matrix<T>& m);
    	Matrix<T>& operator/=(const Matrix<T>& m);
    	Matrix<T>& inverse();
    
    	int& operator()(int line, int column);
    	int& operator()(int line, int column) const;
    
    	int getLines() const;
    	int getColumns() const;
    
    	private:
    	void init(int lines, int columns, T **m);
    	void del() const;
    };
    /****************************************************************************/
    // Gloable Funktionen
    template<typename T>
    Matrix<T>& operator+(const Matrix<T>& l, const Matrix<T>& r);
    template<typename T>
    Matrix<T>& operator-(const Matrix<T>& l, const Matrix<T>& r);
    template<typename T>
    Matrix<T>& operator*(const Matrix<T>& l, const Matrix<T>& r);
    template<typename T>
    Matrix<T>& operator/(const Matrix<T>& l, const Matrix<T>& r);
    template<typename T>
    ostream& operator<<(ostream& o, const Matrix<T>& m);
    /****************************************************************************/
    

    matrix.h:42: error: expected constructor, destructor, or type conversion before '&' token



  • std::ostream
    

    ??
    Oder hast du using namespace im Header drinne(Was man eigentlich nicht haben sollte)



  • Ja, danke das wars.... war klar, dass es so ein scheiß sein muss.


  • Administrator

    Schliesse mich Firefighter an, wenn denn die Zeile im Fehlercode mit der Zeile im gezeigten Code übereinstimmt.

    Ansonsten noch eine Frage zu deinen Operatoren + - * / . Wie kommt es, dass du dort eine Referenz zurück gibst? Diese Operatoren erstellen ein neues Objekt, eine Rückgabe einer Referenz wäre daher nur auf ein temporäres Objekt möglich. Was somit ganz sicher zu Fehler führen wird! Gib dort eine Kopie zurück.

    Grüssli



  • danke für den tipp .... du hast recht das macht keinen sinn

    ich hätts wahrscheinlich beim testen gemerkt



  • int& operator()(int line, int column); 
        int& operator()(int line, int column) const;
    

    Kann so aber nicht ganz stimmen... Vll eher so:

    int& operator()(int line, int column); 
        int operator()(int line, int column) const;
    

    ?
    Normalerweise gibt man bei der const Variante ne const-ref zurück, aber bei nem int... ^^

    bb


Anmelden zum Antworten