Форум программистов, компьютерный форум CyberForum.ru

Как перегрузить оператор в виртуальном классе - C++

Восстановить пароль Регистрация
 
samba777
1 / 1 / 0
Регистрация: 13.02.2010
Сообщений: 8
14.02.2010, 10:01     Как перегрузить оператор в виртуальном классе #1
Помогите пожалста разобраться с перегрузкой операторов в абстрактных классах!!!!

Есть чисто виртуальный класс физических величин
C++
1
2
3
4
5
6
7
8
Fiz_value
{
private:
float value;
public:
Fiz_value(){value=0.0;...}
virtual void func1()=0;
virtual void func2()=0;

// В нём должны быть перегружены операторы:

C++
1
2
3
4
5
6
7
8
9
10
11
Fiz_value * operator+(Fiz_value *f)
{
  // Хочу сделать так
 Fiz_value *tmp;
 tmp->value = this->value + f->value;   // Но т.к. класс абстрактный, то память выделяется только под 
                                                      // указатель, поэтому в этой строчке вылазит ошибка
                                                      // что я лезу в чужую область памяти(tmp=NULL)
 return tmp;
}
 
}
Есть наследники этого класса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Length : public Fiz_value
{
 void func1(){...}
 void func2(){...}
}
 
Volume : public Fiz_value
{
 void func1(){...}
 void func2(){...}
}
 
 
 class MassFV
   {
     private:
              int Len;
              Fiz_value** Arr;
    .....
   }
А в программе надо сделать что-то типа:
C++
1
2
3
4
5
6
7
int main()
{
  MassFV massfv(20); // массив объектов физических величин
 
  Fiz_value t =  massfv[combobox1->Itemindex] + massfv[combobox2->Itemindex];
  MyPrint t;
}
Подскажите пожалста кто чем сможет, а то я весь моск уже сломал !!!

Добавлено через 5 часов 1 минуту
Если кому интересно, то нашёл такой выход, хотя не то что хотелось.
Приходится помещать сумму 2-х величин в одну из них:

Fiz_value * operator+(Fiz_value *f)
{
value = value + f->value;
return this;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2010, 10:01     Как перегрузить оператор в виртуальном классе
Посмотрите здесь:

как перегрузить оператор []? C++
Как перегрузить оператор = C++
C++ Как перегрузить оператор ввода?
C++ Как перегрузить оператор ввода из файла?
C++ Как перегрузить оператор разыменования *
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sekt
 Аватар для Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
14.02.2010, 10:02     Как перегрузить оператор в виртуальном классе #2
C++
1
tmp->value = value + f->value;
пробовали?
samba777
1 / 1 / 0
Регистрация: 13.02.2010
Сообщений: 8
14.02.2010, 10:10  [ТС]     Как перегрузить оператор в виртуальном классе #3
Так не покатит, под tmp память не выделена, а создать экземпляр класса или выделить память оператором new не могу, т.к. он абстрактный

Добавлено через 4 минуты
Кому интересно, разрешил ситуацию так, хотя и не то что хотелось:
C++
1
2
3
4
5
Fiz_value * operator+(Fiz_value *f)
{
     value = value + f->value;
     return this;
}
В этом случае сумма величин сохраняется в одной из них.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
14.02.2010, 11:42     Как перегрузить оператор в виртуальном классе #4
Что-то ужас какой-то... Откуда такое пристрастие к указателям и откуда ожидание, что если создать неинициализированный указатель, то для него сразу создастся соответствующий объект?
Жуткая путаница в основах. Так дела не делаются. Получается, что в зависимости от операндов одна и та же операция сложения (т.е. находящаяся в одном и том же месте кода) может выдавать результаты разных типов. Если уж нужна нормальная работа с физическими величинами, стоит приглядеться к очень интересной реализации из Boost: Units.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
14.02.2010, 12:11     Как перегрузить оператор в виртуальном классе #5
samba777
А ты в курсе, что объекты абстрактных классов создавать нельзя.
И перегрузка операций, в абстрактных классах не имеет смысла, это я так считаю.
samba777
1 / 1 / 0
Регистрация: 13.02.2010
Сообщений: 8
14.02.2010, 13:43  [ТС]     Как перегрузить оператор в виртуальном классе #6
Цитата Сообщение от Genius Ignat Посмотреть сообщение
samba777
А ты в курсе, что объекты абстрактных классов создавать нельзя.
И перегрузка операций, в абстрактных классах не имеет смысла, это я так считаю.
Про абстрактные классы я в курсе, поэтому то я и пытался как-то решить этот вопрос.
Ты говоришь, что перегрузка операций не имеет смысла, хорошо, а как бы ты решал следующую задачу:

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

Переопределить операторы +,-,/,*, >,<,==

Для иллюстрации работы с различными величинами разработать класс массив указателей на базовый класс
и программу, иллюстрирующую возможности данной иерархии
}

Мне кажется, что нужно создать массив указателей на абстрактный базовый класс Геометрические параметры.
Пусть далее пользователь хочет создать физическую величину типа отрезок: вызывается конструктор дочернего класса Отрезок--- создается требуемый объект. Что-то типа:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class MassFV
   {
    private:
              int Len;// размер массива
              Fiz_value** Arr;
              int end;// последний элемент массива
    public:
           void SetN(int n)   //задать размер массива
           {
               ....
              Len=n;   
              Arr= new Fiz_value*[Len]; 
           }
 
           void addElement(int type)
           {
             switch (type)
             {
               case 0:
                      Arr[end]= new Line;
                      end++;
                      break;
               case 1:
                      Arr[end]= new Square;
                      end++;
                      break; 
                  ...... 
           }
....Деструктор......
   };
В этом случае я легко смогу сравнить любые 2 величины массива, умножить, сложить, просто обратившись к ним через массив в основной программе
C++
1
2
3
4
5
6
7
main()
{
   MassFV massfv(20);
 
if (massfv[i] == massfv[j]) ...;
 
}
Как здесь обойтись без перегрузки операторов базового класса??
Чем плох такой подход, просвети меня пожалста, готов к любой критике
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
14.02.2010, 14:00     Как перегрузить оператор в виртуальном классе #7
Ты говоришь, что перегрузка операций не имеет смысла.
Абстрактные классы не для этого придуманы.
хорошо, а как бы ты решал следующую задачу:
Теперь встречный вопрос, в условии задачи написано так: что надо использовать
абстрактные классы, это обязательно?
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
14.02.2010, 14:07     Как перегрузить оператор в виртуальном классе #8
Цитата Сообщение от samba777 Посмотреть сообщение
Для иллюстрации работы с различными величинами разработать класс массив указателей на базовый класс
Цитата Сообщение от samba777 Посмотреть сообщение
Переопределить операторы +,-,/,*, >,<,==
паттерн Посетитель (двойная диспетчеризация)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2010, 14:23     Как перегрузить оператор в виртуальном классе
Еще ссылки по теме:

Как перегрузить оператор C++
C++ Как правильно перегрузить оператор [] =
C++ Как в классе перегрузить оператор двойного индексирование?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
samba777
1 / 1 / 0
Регистрация: 13.02.2010
Сообщений: 8
14.02.2010, 14:23  [ТС]     Как перегрузить оператор в виртуальном классе #9
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Абстрактные классы не для этого придуманы.

Теперь встречный вопрос, в условии задачи написано так: что надо использовать
абстрактные классы, это обязательно?
Ну, вобще-то нет, сказано, что надо проиллюстрировать полиморфизм в данных классах. Думаешь, что здесь можно обойтись просто virtual func() ?
Правда я не совсем представляю, зачем мне определять функцию базового класса, которая в принципе никогда не будет вызвана, поскольку в общем случае у класса , например, Фигура, не может быть определённого метода Draw(); просто не понятно, что есть фигура в общем случае и как её рисовать.
Вот я и решил, что нет смысла определять эту функцию, поэтому и сделал её чисто виртуальной, а соотвтественно и весь класс.
Yandex
Объявления
14.02.2010, 14:23     Как перегрузить оператор в виртуальном классе
Ответ Создать тему
Опции темы

Текущее время: 15:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru