Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перегрузка операторов  (Прочитано 19646 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
Anklav
Гость
« : 04-02-2004 23:25 » 

Вот, помогите разобраться.

Имею базовый класс:
Код:
class CA
{
public:
CA();
CA(int)
~CA();
CA& operator =(int);
void operator +=(int);
};
Имею производный:
Код:
class CB: public CA
{
public:
CB();
CB(int);
~CB();
};
Где-то в программе:
Код:
CB b;
b = 10;
При этом выскакивает ошибка, что, мол, у меня не определена операция "=" для этого класса
Но в тоже время, это:
Код:
b += 10;
работает нармально

Компилятор - VC6
Заранее спасибо
« Последнее редактирование: 23-11-2007 21:35 от Алексей1153++ » Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #1 : 05-02-2004 08:36 » 

перегруженный оператор = не будет виден в производных классах .... таков стандарт, а MSDN по этому поводу говорит следующее....

The assignment operator (=) is, strictly speaking, a binary operator. Its declaration is identical to any other binary operator, with the following exceptions:

It must be a nonstatic member function. No operator= can be declared as a nonmember function.
It is not inherited by derived classes.
A default operator= function can be generated by the compiler for class types if none exists. (For more information about default operator= functions, see Memberwise Assignment and Initialization.)

вот видишь написано  :!: It is not inherited by derived classes :!:
так что если хочешь иметь такое
Цитата
CB b;
b = 10;


то руками переопределяй в производном...   а кому ща легко
Записан

С уважением Lapulya
Anklav
Гость
« Ответ #2 : 06-02-2004 00:10 » 

Ну, а что тогда делать, если, допустим, разработчик  производного класса ничего не знает о реализации базового класса.
Записан
Kuzmich
Гость
« Ответ #3 : 06-02-2004 04:36 » 

в твоем данном конкретном случае, разработчик производного класса догадается перегрузить оператор присвоения.
Записан
Anonymous
Гость
« Ответ #4 : 06-02-2004 08:20 » 

to Anklav,
Цитата

Ну, а что тогда делать, если, допустим, разработчик производного класса ничего не знает о реализации базового класса.

о реализации он может и не знать а вот об интерфейсе знать обязан!
По этому увидев это
Цитата

   CA& operator =(int);

он поймет что должен перегрузить оператор = если хочет чтобы это
Цитата

CB b;
b = 10;

работало
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #5 : 06-02-2004 08:21 » 

блин.... забыл зарегиться.... это типа я был Отлично
Записан

С уважением Lapulya
Anklav
Гость
« Ответ #6 : 07-02-2004 01:39 » 

Но как же он перегрузит его, если он не чего не знает о реализации и у него тока h файл и obj, например
Записан
Serega
Гость
« Ответ #7 : 07-02-2004 08:00 » 

Цитата: Anklav
Ну, а что тогда делать, если, допустим, разработчик  производного класса ничего не знает о реализации базового класса.

А зачем он тогда вообще его использует ?
Ради прикола поюзать кота в мешке чтоли ? Отлично
Записан
Anchorite
Гость
« Ответ #8 : 07-02-2004 11:28 » 

Ты можешь вызвать оператор присваивания базового классса следующим образом
CB& operator = (int n)
{
   CA::operator =(n);
   return (*this);
}
Записан
Anklav
Гость
« Ответ #9 : 07-02-2004 23:14 » new

Блин. Точно. Вот это я и искал. Спосибо Anchorite
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #10 : 09-02-2004 13:07 » 

ну ты даешь Anklav...
из твоего вопроса ну ни как не следовало что тебе надо именно это
Цитата

CB& operator = (int n)
{
CA::operator =(n);
return (*this);
}

эсли бы ты конкретизировал вопрос, то уже давно бы ответ получил....
Записан

С уважением Lapulya
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #11 : 11-03-2010 07:20 » 

Утро доброе. Перегружаю оператор [] следующим образом:
Код:
CFeature* & operator [](int index){return m_vecFeatures[index];}

Если работаю с объектом, то оператор [] используется нормально, когда работаю с указателем, то не получается, можно только так:
Код:
CFeature* foo=cursor->operator [](i);

Имеется ввиду, что
Код:
CFeature* foo=cursor[i];
ругается : error C2440: 'initializing' : cannot convert from 'CFeatureCursor' to 'CFeature *', не пашет, если cursor - указатель на класс. Где я туплю?

« Последнее редактирование: 11-03-2010 07:22 от yudjin » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 11-03-2010 07:23 » 

С указателями оператор [] и не должен так работать.
Код:
foo = (*cursor)[i];
cursor - это ведь указатель на курсор?
Записан
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #13 : 11-03-2010 07:24 » 

Да,
Код:
 CFeatureCursor *cursor;
Действительно, помогло. А это только с оператором [] так, или все указатели нужно разыменовывать для работы с перегруженными операторами?
Спасибо.
« Последнее редактирование: 11-03-2010 07:26 от yudjin » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 11-03-2010 07:40 » 

или так
Код:
foo = cursor->operator[](i);
Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 11-03-2010 07:53 » 

А это только с оператором [] так, или все указатели нужно разыменовывать для работы с перегруженными операторами?
Спасибо.
Насколько я знаю, со всеми, кроме оператора ->

С другой стороны, с неперегруженными разыменовывать нужно всё равно: иначе операторы выполняются над указателями (будь то копирование, арифметика, сравнение, или что ещё).

Оператор -> в этом смысле особенный, и ведёт себя не совсем так, как обычно. Хотя это не касается разыменования напрямую, но это касается рекурсивности применения ->
« Последнее редактирование: 11-03-2010 07:56 от Вад » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines