• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

оператор []

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

Slawutich

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

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



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

Sliva

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

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

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

Slawutich

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

grigsoft

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

Guest

прокси-объект?
Код:
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);}
...
};
 
G

grigsoft

Ну можно и так, если внутренняя структура матрицы не предусматривает объекты типа Строка\Столбец.
 
S

Slawutich

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

Код:
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];
}
И все прекрасно работает

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

Вложения

  • 2d_array.JPG
    2d_array.JPG
    6,5 КБ · Просмотры: 515
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!