Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: оператор []
Форум программистов > Системное программирование > C, С++ и С Builder > Общие вопросы по С и С++
Slawutich
Значит имеется класс с названием Матрица обрабатывает все возможные операции с двухмерными динамическими массивоми путем перегрузки операторов +,-,==,=, и т.д. подскажите как правильноперегрузить оператор []
чтоб я мог сделать вот такое:

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



коротко говоря обращаться к любой ячейки масива и производить туда запись или чтение
Sliva
Вот так можно перегрузить [] один элемент - пробовала, работает rolleyes.gif

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

type & operator [] (int x) // переопределение операции [] {
if ((x<0)||(x>=size))
{
cerr <<"Недопустимый индекс!!!";
x = 0;
}
return massiv[x];
}
cool.gif
Slawutich
Как одномерный массив перегрузить я в курсе но мне надо оператор перегрузить так чтоб я мог пользоваться двухмерным массивом
grigsoft
Гм, вроде я сегодня уже отвечал. Можно из Матрица[] возвращать объект Строка, а уже Строка[] будет возвращать элемент матрицы. Тогда будет возможна запись Матрица[][]
Гость
прокси-объект?
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
Ну можно и так, если внутренняя структура матрицы не предусматривает объекты типа Строка\Столбец.
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];
}

И все прекрасно работает

дело в том что если посмотреть на структуру динамического массива (см. картинку ниже) то получаеться что вертикальный столбец содержит указатели на начало горизонтальных вот и выходит что перегружаем сперва первые скобки находим нужный указатель потом сразу перегружаються вторые скобки и получаем указатель на требуемое значение и делаем с ним все что хотим.
И всеравно всем спасибо smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.