Operator indeksowania macierzy [][]

Odpowiedz Nowy wątek
2015-01-17 14:23
0

Witam,
Ostatnio męczę się z operatorem indeksowania do macierzy. Macierz mam na tablicy wskaźników, nie na vectorze i tak chciałbym żeby zostało. Tak samo nie mogę zamienić na operator (), musi to być [][]. Czytałem już dużo o tym na internecie, ale nie znalazłem oczekiwanego rezultatu. Oto co próbowałem:
Array.h:

struct Row;

class Array
{
public:
    const int m;
    const int n;
    int** array;
    Array(int m = 0, int n = 0);

    Row operator[](int index);
};
struct Row
{
    int* array;

    Row(int* _array) : array(_array) {};

    int& operator[](int index)
    {
        return array[index];
    }
}; 

Array.cpp:

Row Array::operator[](int index)
{
    return Row(this->array[index]);
}

Oczywiście nie wstawiałem całego kodu, bo stwierdziłem nie ma to większego znaczenia. Wszystko co potrzebne oczywiście jest :) -> konstruktory, destruktory itp.

edytowany 2x, ostatnio: lukaszs7, 2015-01-17 14:31
No i może byś łaskawie napisał co jest nie tak? Nie kompiluje się, są błedy, co konkretnie nie działa? Nikomu nie chce się myśleć za Ciebie, w Twoim interesie jest dokładnie opisać problem. http://rtfm.killfile.pl/ - Endrju 2015-01-17 14:31

Pozostało 580 znaków

2015-01-17 14:35
0

Przy wywołaniu
cout << array[1][2] np. visual pluje się o niezgodność typów. Że chce coutem Row wydrukować. Ale wydaję mi się, że wszystko jest ok, bo array[1] zwraca Row, a dalej [2] zwraca int...

Kod który podałeś jest w zasadzie poprawny, błąd jest gdzie indziej. - Endrju 2015-01-17 14:54

Pozostało 580 znaków

2015-01-17 14:42
1
#include <iostream>
using namespace std;

struct matrix {
    matrix(int w, int h): _w(w), _h(h), _data(new int[w * h]) {}

    int w() const { return _w; }
    int h() const { return _h; }

    int* operator[](int idx) { return _data + (idx * h()); }
    const int* operator[](int idx) const { return _data + (idx * h()); }
private:
    int _w, _h;
    int* _data;
};

ostream& operator<<(ostream& out, const matrix& m) {
    for(int i = 0; i < m.w(); ++i) {
        for(int j = 0; j < m.h(); ++j) {
            out << m[i][j] << " ";
        }
        out << "\n";
    }
    return out;
}

int main() {
    matrix m{5, 3};
    m[0][2] = 333;
    m[2][0] = 555;
    m[4][0] = 111;
    cout << m;
    return 0;
}
Wołanie geterów wewnątrz implementacji klasy jest pozbawione sensu. - satirev 2015-01-17 15:05
Bo można użyć bezpośrednio pól tej klasy. - satirev 2015-01-17 17:32

Pozostało 580 znaków

2015-01-17 14:48
0

Męczyłem się z tym nie wiadomo jak długo, napisałem i w końcu znalazłem błąd... :P
Tworzyłem macierz dynamicznie przez wskaźnik dlatego była niezgodność.. ehh.
Temat do zamknięcia ;)
PS. Mimo wszystko dzięki za pomoc :)

edytowany 1x, ostatnio: lukaszs7, 2015-01-17 14:49

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0