Перегрузка операторов

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Перегрузка операторов

Re: Перегрузка операторов

Romeo » 07 апр 2009, 11:50

Вот так:

Код: Выделить всё

std::cout << (*this)[id] << std::endl;
Или так:

Код: Выделить всё

std::cout << this->operator[](id) << std::endl;

Re: Перегрузка операторов и Шаблоны

Monopo » 06 апр 2009, 18:47

Не знаю, как вывести элемент класса-"массива" из перегруженного оператора [].

Код: Выделить всё

class TMas // создал абстрактный, чтобы в главной проге работать с одним указателем, а не с кучей типизированных указателей на объект
{
        public:
        virtual void PrintElem(const int& id)=0;
        //..
};

template <class TType> class Massiv: virtual public TMas
{
    public:
    //..
    void PrintElem(const int& id);
    TType operator[](const int& id);
    protected:
    struct TT{
                TType item;
                TT*next;
    };
    int count;
    TT *Head;
    TT *Last;
};
---------> И вот мне надо id-й элемент вывести, вызываю в главной функции PrintElem(id).

Код: Выделить всё

template <class TType>
TType Massiv<TType>: :o perator[](const int& id) // Перегрузка нужна по заданию
{
     // Нахожу нужный id-ый элемент, присваиваю его TT* Tc
    return Tc->item;
}

template <class TType>
void Massiv<TType>::PrintElem(const int& id)
{
        // Всякие проверки индекса
        // cout<< ?????????? - Вот здесь пытаюсь вывести этот самый X[id] перегруженного [], но не знаю, как вывести id-й элемент из this..
}

Re: Перегрузка операторов

Romeo » 09 мар 2009, 19:19

&quot писал(а):компилятор никак не хочет съедать
Да это я опечатался. Твой последний вариант более корректен.

Re: Перегрузка операторов

Monopo » 09 мар 2009, 18:46

Да, перемудрил, наверное, но компилятор никак не хочет съедать

Код: Выделить всё

double& Matrix: :o perator(int x, int y)
А вот так съедает почему-то

Код: Выделить всё

double& Matrix: :o perator()(int x, int y)
А главное, правильный ответ выводит..

Re: Перегрузка операторов

Romeo » 07 мар 2009, 18:59

Ты перемудрил с перегрузкой. Прототип должен быть проще:

Код: Выделить всё

double& Matrix: :o perator(int x, int y)
Вызвать тоже просто. Вот два варианта:

Код: Выделить всё

Matix m;
double d1 = m(1,2);

Matrix* pM = new Matrix();
double d2 = (*pM)(1, 2);
delete pM;

Re: Перегрузка операторов

Monopo » 06 мар 2009, 17:08

Спасибо. Был весьма удивлен, когда после всех new заработало вот в такой вот форме:

Код: Выделить всё

(*(P1->item)+*(P2->item)).Print();
У меня вот еще созрел вопрос. Пытаюсь перегрузить () - доступ к элементу матрицы. Чтобы иметь представление, как это делается, быстренько накатал вот сие:

Код: Выделить всё

double& Matrix: :o perator()(const int& idx,const int& idy)
{
        if((idx>count)||(idy>count)||(idx<0)||(idy<0))
        {
                cout<<"ERROR!! The sizes are different!!"<<endl; // введенные индексы не подходят под размер
                exit(1); // выход
        }
        else return mas[idx][idy];
}
Дальше продвинуться не могу, ибо не знаю, как вызвать теперь эту функцию))

Re: Перегрузка операторов

Romeo » 05 мар 2009, 11:14

Сорри, не было времени прочитать код подробно. Написал первую проблему, которую увидел. Тогда да, нужно разыменовывать указатели на матрицы перед тем, как написать +, иначе будет попытака сложить поинтеры вместо вызова оператора + для класса Matrix.

Re: Перегрузка операторов

BBB » 05 мар 2009, 10:26

Airhand писал(а):Как верно заметил Romeo, нужно создать объекты перед их исползованием. Без этого, ты делаеш попытку складывать неинициализированные указатели, вот оно и ругается.
Блин, робяты, ну вы что, ведь в исходном тексте же написано:

Код: Выделить всё

        // По ходу выполнения P1 и P2 присваиваются
        // определенные TMatr*
Т.е., как я понимаю создание и инициализация просто в приведнном здесь тексте опущены, чтобы не загромождать место.

Re: Перегрузка операторов

Airhand » 04 мар 2009, 16:19

Monopo писал(а):

Код: Выделить всё

void main()
{
        TMatr *Head /*голова*/ ,*TP,*P1,*P2;
        // По ходу выполнения P1 и P2 присваиваются
        // определенные TMatr*
        TP->item=(P1->item)+(P2->item); // Ошибка e2085 Invalid pointer addition (C++ Builder 6)
}
Скажите, пожалуйста, как ошибку исправить? Я так понимаю, это из-за сложения указателей? Или нет? :confused:

Как верно заметил Romeo, нужно создать объекты перед их исползованием. Без этого, ты делаеш попытку складывать неинициализированные указатели, вот оно и ругается.

Re: Перегрузка операторов

BBB » 04 мар 2009, 09:48

Monopo писал(а):

Код: Выделить всё

void main()
{
        TMatr *Head /*голова*/ ,*TP,*P1,*P2;
        // По ходу выполнения P1 и P2 присваиваются
        // определенные TMatr*
        TP->item=(P1->item)+(P2->item); // Ошибка e2085 Invalid pointer addition (C++ Builder 6)
}
Скажите, пожалуйста, как ошибку исправить? Я так понимаю, это из-за сложения указателей? Или нет? :confused:
P1->item и P2->item - это указатели на Matrix. Как я понимаю, делается попытка найти сумму матриц, т.е. сумму двух экземпляров Matrix. Если так, то следует быть написанным:

Код: Выделить всё

  *(TP->item) = *(P1->item) + *(P2->item);

Вернуться к началу