Страница 3 из 3
Re: Перегрузка операторов
Добавлено: 04 мар 2009, 09:48
BBB
Monopo писал(а):Код: Выделить всё
void main()
{
TMatr *Head /*голова*/ ,*TP,*P1,*P2;
// По ходу выполнения P1 и P2 присваиваются
// определенные TMatr*
TP->item=(P1->item)+(P2->item); // Ошибка e2085 Invalid pointer addition (C++ Builder 6)
}
Скажите, пожалуйста, как ошибку исправить? Я так понимаю, это из-за сложения указателей? Или нет?
P1->item и P2->item - это указатели на Matrix. Как я понимаю, делается попытка найти сумму матриц, т.е. сумму двух экземпляров Matrix. Если так, то следует быть написанным:
Re: Перегрузка операторов
Добавлено: 04 мар 2009, 16:19
Airhand
Monopo писал(а):
Код: Выделить всё
void main()
{
TMatr *Head /*голова*/ ,*TP,*P1,*P2;
// По ходу выполнения P1 и P2 присваиваются
// определенные TMatr*
TP->item=(P1->item)+(P2->item); // Ошибка e2085 Invalid pointer addition (C++ Builder 6)
}
Скажите, пожалуйста, как ошибку исправить? Я так понимаю, это из-за сложения указателей? Или нет?
Как верно заметил Romeo, нужно создать объекты перед их исползованием. Без этого, ты делаеш попытку складывать неинициализированные указатели, вот оно и ругается.
Re: Перегрузка операторов
Добавлено: 05 мар 2009, 10:26
BBB
Airhand писал(а):Как верно заметил Romeo, нужно создать объекты перед их исползованием. Без этого, ты делаеш попытку складывать неинициализированные указатели, вот оно и ругается.
Блин,
робяты, ну вы что, ведь в исходном тексте же написано:
Код: Выделить всё
// По ходу выполнения P1 и P2 присваиваются
// определенные TMatr*
Т.е., как я понимаю создание и инициализация просто в приведнном здесь тексте опущены, чтобы не загромождать место.
Re: Перегрузка операторов
Добавлено: 05 мар 2009, 11:14
Romeo
Сорри, не было времени прочитать код подробно. Написал первую проблему, которую увидел. Тогда да, нужно разыменовывать указатели на матрицы перед тем, как написать +, иначе будет попытака сложить поинтеры вместо вызова оператора + для класса Matrix.
Re: Перегрузка операторов
Добавлено: 06 мар 2009, 17:08
Monopo
Спасибо. Был весьма удивлен, когда после всех new заработало вот в такой вот форме:
У меня вот еще созрел вопрос. Пытаюсь перегрузить () - доступ к элементу матрицы. Чтобы иметь представление, как это делается, быстренько накатал вот сие:
Код: Выделить всё
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: Перегрузка операторов
Добавлено: 07 мар 2009, 18:59
Romeo
Ты перемудрил с перегрузкой. Прототип должен быть проще:
Вызвать тоже просто. Вот два варианта:
Код: Выделить всё
Matix m;
double d1 = m(1,2);
Matrix* pM = new Matrix();
double d2 = (*pM)(1, 2);
delete pM;
Re: Перегрузка операторов
Добавлено: 09 мар 2009, 18:46
Monopo
Да, перемудрил, наверное, но компилятор никак не хочет съедать
А вот так съедает почему-то
А главное, правильный ответ выводит..
Re: Перегрузка операторов
Добавлено: 09 мар 2009, 19:19
Romeo
" писал(а):компилятор никак не хочет съедать
Да это я опечатался. Твой последний вариант более корректен.
Re: Перегрузка операторов и Шаблоны
Добавлено: 06 апр 2009, 18:47
Monopo
Не знаю, как вывести элемент класса-"массива" из перегруженного оператора [].
Код: Выделить всё
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: Перегрузка операторов
Добавлено: 07 апр 2009, 11:50
Romeo
Вот так:
Или так:
Код: Выделить всё
std::cout << this->operator[](id) << std::endl;