оператор []

  • Автор темы Slawutich
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

Slawutich

#1
Значит имеется класс с названием Матрица обрабатывает все возможные операции с двухмерными динамическими массивоми путем перегрузки операторов +,-,==,=, и т.д. подскажите как правильноперегрузить оператор []
чтоб я мог сделать вот такое:

Matrica a;
cin>>a[3][1];
cout<<a[3][1];



коротко говоря обращаться к любой ячейки масива и производить туда запись или чтение
 
S

Sliva

#2
Вот так можно перегрузить [] один элемент - пробовала, работает :blink:

template <class type> class Array // некий шаблон

type & operator [] (int x) // переопределение операции [] {
if ((x<0)||(x>=size))
{
cerr <<"Недопустимый индекс!!!";
x = 0;
}
return massiv[x];
}
;)
 
S

Slawutich

#3
Как одномерный массив перегрузить я в курсе но мне надо оператор перегрузить так чтоб я мог пользоваться двухмерным массивом
 

grigsoft

Well-known member
15.11.2005
735
0
#4
Гм, вроде я сегодня уже отвечал. Можно из Матрица[] возвращать объект Строка, а уже Строка[] будет возвращать элемент матрицы. Тогда будет возможна запись Матрица[][]
 
G

Guest

#5
прокси-объект?
Код:
class matrix
{
private:
class proxy
{
private:
matrix& outer;
unsigned int rows;
public:
proxy(matrix& obj_a, unsigned int obj_b)
: outer(obj_a), rows(obj_b) {}
int& operator[](unsigned int colums)
{return outer.get(rows,colums);}
};
public:
int& get(unsigned int rows, unsigned int colums) {...}
proxy operator[](unsigned int rows)
{return proxy(*this,rows);}
...
};
 

grigsoft

Well-known member
15.11.2005
735
0
#6
Ну можно и так, если внутренняя структура матрицы не предусматривает объекты типа Строка\Столбец.
 
S

Slawutich

#7
Я тут немного покумекал и вот к чему пришел

Код:
class Matrica
{
private:
int **d2array;
int sizeX;
int sizeY;
public:

Matrica(); //конструктор по умолчанию
friend ostream& operator<<(ostream&, const Matrica&);//перегрузка ввывода
friend istream& operator>>(istream&, Matrica&);//перегрузка ввода
int* operator [](const int);//Перегрузка оператора []
~Matrica();//Деструктор
};



//Перегрузка оператора []
int* Matrica::operator [](const int i)
{
return d2array[i];
}


void main()
{

Matrica a;
a[1][3]=4;
cout<<a[1][3];
cin>>a[0][2];
}
И все прекрасно работает

дело в том что если посмотреть на структуру динамического массива (см. картинку ниже) то получаеться что вертикальный столбец содержит указатели на начало горизонтальных вот и выходит что перегружаем сперва первые скобки находим нужный указатель потом сразу перегружаються вторые скобки и получаем указатель на требуемое значение и делаем с ним все что хотим.
И всеравно всем спасибо :)
 

Вложения

Статус
Закрыто для дальнейших ответов.