przeladowanie operatora [][]

0

a ja mam prosbe bardzo wielka szybka i szukam 3 dzien jak
mam klase przykladowo x ktora ma tablice 2 wymairowa zeby se sobie z niej pobrac taze
tak ladnie
class x
{

tab int[10][10];
pobierz [][] ?????????????????????????????????????????????
wstaw [][] ?????????????????????????????????????????????
}
x a;
int i=a[1][1];

a jakby jeszcze ktos napisal jaka jest roznica miedzy
int operator[](int el) {return Tab[el];}
int & operator[](int el) {return Tab[el];}
ps
no i zamiast wyslij klikam f9 :P
trza sie kimnac

0
  1. http://groups.google.pl/group/pl.comp.lang.c/msg/f12fb8d1c5a27609
  2. Pierwsze zwraca wartość, drugie referencję. Przez pierwsze nie możesz zmieniać (więc metoda powinna być const), a przez drugie tak.
0

thx

0
class x
{
private:
  int tab[10][10];
public:
  int* operator[](int i) { return tab[i]; };
};

//...

x tablica;
tablica[1][2] = 3;
0

Hm, trzeba zwracać wskaźnik, jak można zwrócić tablicę (refem)?
No i co, jeśli układ tablicy taki fajny nie jest? Proxami można zrobić dowolne cuda, a tu jesteś ograniczony do jednej, konkretnej wewnętrznej reprezentacji.

0

Yyyy, możesz jaśniej i bardziej po polsku?

Jeśli użyjemy zaproponowanego rozwiązania przeze mnie, czyli operator[] zwracający wskaźnik, to komórki jednego wiersza (lub kolumny, zależy który wymiar przyjmiemy jako drugi) muszą leżeć w pamięci obok siebie i w odpowiedniej kolejności. Dodatkowo nie możemy kontrolować poprawności indeksu drugiego wymiaru. Póki nam to wystarcza nie ma co komplikować. Zazwyczaj będzie wystarczać.

Rozwiązanie z osobną klasą do którego link podałeś, w takiej postaci jak teraz nie oferuje nic ponad moje rozwiązanie.
W dodatku jest do d**y napisane :p , a ten fragment:

  row() {
    for (size_t i = 0; i < COLUMNS; ++i)
      tab_[i] = T();
  }

WTF'em zalatuje.

0
adf88 napisał(a)

Rozwiązanie z osobną klasą do którego link podałeś, w takiej postaci jak teraz nie oferuje nic ponad moje rozwiązanie.
Nie? To, że się kompiluje, to pies?
A jak trzeba będzie coś zmienić w wewnętrznej reprezentacji, to ty będziesz robił akrobacje, ja zmienię kilka linii.

adf88 napisał(a)

W dodatku jest do d**y napisane
Tu chodziło o koncepcję.

Aha, popraw ten ort:

pÓÓÓÓki
Strasznie wali po oczach.

0

Stonuj trochę. Przecież cię nie atakuje, próbuje przedstawić fakty i wyciągnąć jakieś wnioski. Witać po tej reakcji twoje zakłopotanie.

Fanael napisał(a)
adf88 napisał(a)

Rozwiązanie z osobną klasą do którego link podałeś, w takiej postaci jak teraz nie oferuje nic ponad moje rozwiązanie.
Nie? To, że się kompiluje, to pies?
Argument "kompiluje się" jest nic nie warty, sam pisałeś, że chodzi o ideę. Powieliłem błąd autora bo kod przeklejałem, już poprawione z "tab int[10][10];" na "int tab[10][10];". Ale naprawdę to nie jest istotna sprawa, nie dotyku problemu autora.

Fanael napisał(a)

A jak trzeba będzie coś zmienić w wewnętrznej reprezentacji, to ty będziesz robił akrobacje, ja zmienię kilka linii.
Wisz co właściwie powiedziałbym odwrotnie. Jakoś nie potrafię wyobrazić sobie sytuacji o której mówisz (z wyjątkiem sytuacji, które całkowicie wykluczają moje rozwiązanie), może potrafisz jakiś przykład przytoczyć? Pamięta o idei - tablica dwuwymiarowa.
Jeszcze jedna sytuaja przyszła mi do głowy, która wyklucza moje rozwiązanie. Właściwie wynika ona bezpośrednio z założeń - niemożność zdefiniowania operatów dla wiersza, sensowny mógłby być np. operator przypisania aby w prosty sposób skopiować wiersz z jednej tablicy do drugiej. pÓÓÓÓki nie zależy nam na takich rozwiązaniach nie ma sensu komplikować kod.

Fanael napisał(a)
adf88 napisał(a)

W dodatku jest do d**y napisane
Tu chodziło o koncepcję.
Zgadzam się. To nie było na całkiem poważnie jakbyś buźki nie zauważył. Chciałem przytoczyć na marginesie nieco zabawny fragment kodu.

Fanael napisał(a)

Aha, popraw ten ort:

pÓÓÓÓki
Strasznie wali po oczach.
Nobody's perfect ;)

0

gdybym tak np zastosowal sie spytam to co by bylo zle

template <typename T,int cols_,int rows_>
class dupa
{public:
int cols,rows;
T tab[cols_][rows_];

dupa ()
{ cols=cols_;rows=rows_;}
T* operator[](int i)
{return tab[i];}
};

i moze 1 pytanko do panow wiedzacych
tak od podstaw jak mozna
zwracanie operatora [] przez wskaznik a przez adres, jaka roznica (prosze bez smiechu bo wiem ale nie bardzo jarze)

0

Złe jest to, że tablica zadeklarowana w ten sposób musi mieć stały rozmiar, nie może być to zmienna. Musisz użyć dynamicznego tworzenia. Kiedyś napisałem ... o znalazłem. Tak to kiedyś zrobiłem:

template <class T>
class Talica2D
{
protected:
	T* komorki;
	int wysokosc;
	int szerokosc;

	void Utworz(int wysokosc_, int szerokosc_)
	{
		wysokosc = wysokosc_;
		szerokosc = szerokosc_;
		komorki = new T[wysokosc_ * szerokosc_];
	}

	void Niszcz() { delete komorki; }
public:
	Talica2D() { Utworz(0, 0); }
	Talica2D(int wysokosc_, int szerokosc_) { Utworz(wysokosc_, szerokosc_); }

	~Talica2D() { Niszcz(); }

	int Wysokosc() { return wysokosc; }
	int Szerokosc() { return szerokosc; }

	T* operator[](int wiersz) { return komorki + wiersz * szerokosc; }
};
adi2009 napisał(a)

zwracanie operatora [] przez wskaznik a przez adres, jaka roznica
Żadna, to jest to samo.

0

czyli tak np:

template <typename T,int cols_,int rows_>
class dupa
{public:
int cols,rows;
T* tab;
n (int cols,int rows) {tab=new int[colsrows];} //jakby sie potrzeba to mozna do zmiany wielkosci tablicy
dupa ()
{
n(cols_,rows_);
cols=cols_;rows=rows_;}
T
operator[](int i)
{return &tab[i];}
};

tylko powruce do pytania z & lub *
bo jak w 3 linice od dolu zmienie * na & to juz " dupa<int,3,3> aaa;aaa[1][2]=9; " nie jest taki kompilator dobry do popelnionej zbrodni
zwracany tez linije nizej jest adres jakos tak to udziwnilem

bardzo bym byl rad gdyby ktos chcial by mnie ten niepotrzebny problem wytlumaczyc

0

jesze moze spytam jak darmo ;P
przyklad z linka z pierwszej odp jest tam static zmienne do rozmiaru. se czytam i niemoge dojsc czemu na kazdej zadeklarowanej zmiennej tej samej super klasy jest inna wartosc

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