Operatorüberladung



  • Hi,
    ist es möglich den Indexoperator für mehrdimensionale Arrays zu überladen?
    Mein Versuch:

    T& operator[][](int firstIndex, int secondIndex) {
    		assert(firstIndex < zeilen && secondIndex < spalten);
    		return ptr[firstIndex*spalten + secondIndex];
    	}
    	const T& operator[][](int firstIndex, int secondIndex) const {
    		assert(firstIndex < zeilen && secondIndex < spalten);
    		return ptr[firstIndex*spalten + secondIndex];
    	}
    

    Konstruktor etc. der Klasse sind so weit inordnung. Wenn ich die Klasse in main instanziiere:

    Array2d<int> arr(2, 5);
    

    und anschließend die Indexoperatoren verwenden will:

    for (size_t i = 0; i < arr.getZeilen(); ++i) {
    		for (size_t j = 0; j < arr.getSpalten(); ++j) {
    			arr[i][j] = i*j;
    		}
    	}
    

    wirft der Compiler folgende Fehlermeldung:

    Severity	Code	Description	Project	File	Line
    Error		IntelliSense: no operator "[]" matches these operands
                operand types are: Array2d<int> [ size_t ]
    


  • Einen operator[][] gibt es nicht. Bau Dir einen operator[], der ein Proxy-Objekt, also eine Sicht auf eine Zeile Deiner Matrix zurückgibt. Und die Zeile hat dann wieder einen operator[]



  • Nein du kannst keinen operator[][] überladen. Es gibt aber eine Reihe von anderen Möglichkeiten. Du überlädst normal den operator[], der dann ein Objekt zurückgibt für das es wieder einen operator[] gibt. Das einfachste wäre einfach einen Pointer zu nehmen, es kann aber auch irgendeine Helper Klasse sein. Mit dem Pointer würde es dann so aussehen:

    T* operator[] (int firstIndex) {
      assert(firstIndex < zeilen);
      return &ptr[firstIndex*spalten];
    }
    

    Du verlierst aber dadurch aber die Möglichkeit ein assert für den zweiten Index einzubauen. Dafür müsstest du eine Helper Klasse nutzen.



  • Nice, dankö 👍



  • Du kannst den operator() überladen und ihm beliebig viele Argumente mitgeben.

    T& Array2D::operator()( std::size_t RowIndex, std::size_t ColIndex )
    {
       ...
    }
    
    int main()
    {
       Array2D<double> arr;
       ...
       double v = arr( 0,1 );
    }
    

Anmelden zum Antworten