Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка операторов и полиморфизм 
:(
    Опции темы
grokk
Дата 13.5.2008, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.5.2008

Репутация: нет
Всего: нет



Есть массив указателей Data* в каждой ячейке которого указатель на string,int или float
Никак не получается перегрузить оператор + так чтобы string+string оставался string int+float оставался float int+int -int string+int/float-string

Заранее спасибо,буду рад любой помощи а то уже всю голову изломал

Код

#ifndef Data_Lst_H
#define Data_Lst_H
#include<iostream>
#include<string>

usingnamespace std;

enum Type {kInteger,kFloat,kString};
class Data
{

public:
    virrtual ~Data() {};
    virtual Type CheckData() const=0;

};


class Int:public Data
{ 
   int i;
   Type int_type;
public:
   Int (int int_num)
{
   i=int_num;
   int_type=kInteger;
}

Int (Int& data_int)
{
   i=data_int.i;
   int_type=data_int.int_type;
}

Type CheckData()const 
{ 
   cout<<"Int number "<<i<<endl;
    return int_type;
}


};
class Float:public Data
{ 
   float f;
   Type float_type;
public:
   Float (float float_num)
{
     f=float_num;
     float_type=kFloat;
}

Type CheckData()const 
{ 
   cout<<"Float number "<<f<<endl;
   return float_type;
}

};
Data* InputData();
#endif

Data* InputData()
{
  int flag,int_num,count=0;
  float float_num;
  char str[20];
  char c;
  Data* item;

do
{
  cout<<"(1)int (2)float (3)string: ";
  cin>>flag;
}while (flag<1 || flag>3);


switch (flag)
{
 case 1:{
              cout<<"Enter int number ";
              cin>>int_num;
              item=new Int(int_num);
              return item;
              break;
}

case 2:{
            cout<<"Enter float number ";
            cin>>float_num;
            item=new Float(float_num);
            return item;
            break;
}

case 3:{
             cout<<"Enter String. Max lenght 20 ";
             cin>>str;
             item=new String(str);
             return item;
             break;
}
}
return NULL;
}


Это сообщение отредактировал(а) grokk - 13.5.2008, 23:02
PM MAIL   Вверх
bsa
Дата 13.5.2008, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



grokk, переформатируй код - без отступов читать очень сложно.

Зачем ты создавал классы Float и Int, тебе функциональности штатных типов мало?

То, что тебе нужно реализуется достаточно просто - нужно лишь три раза перегрузить оператор+ для класса Data (для string, float и int). А уже в нем определять, что в итоге получится.

PM   Вверх
grokk
Дата 13.5.2008, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.5.2008

Репутация: нет
Всего: нет



Цитата(bsa @ 13.5.2008,  22:38)
grokk, переформатируй код - без отступов читать очень сложно.

Зачем ты создавал классы Float и Int, тебе функциональности штатных типов мало?

То, что тебе нужно реализуется достаточно просто - нужно лишь три раза перегрузить оператор+ для класса Data (для string, float и int). А уже в нем определять, что в итоге получится.

классы float и int создавал для себя,чисто потренироватся,естественно можно было обйтись стандартом

я думал что можно както перегрузить оператор + в Date  для всех сразу.
То что ты имеешь ввиду это сделать
Data& Int::operator +(const Int&)
Data& Float::operator +(const Float&)
Data& String::operator +(const String&)
и не прописовать вобще ничего в Data?
сорри за нубские вопросы просто тема виртуальных методов для меня достатачно нов)

PM MAIL   Вверх
bsa
Дата 14.5.2008, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



А причем тут виртуальные методы?

не нужно перегружать методы классов Int, Float и String. Нужно перегрузить методы класса Data:
Код
class Data
{
...
public:
   Data operator+(int value) const;
   Data operator+(float value) const;
   Data operator+(string value) const;
};

PM   Вверх
grokk
Дата 14.5.2008, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.5.2008

Репутация: нет
Всего: нет



Цитата(bsa @ 14.5.2008,  14:35)
А причем тут виртуальные методы?

не нужно перегружать методы классов Int, Float и String. Нужно перегрузить методы класса Data:
Код
class Data
{
...
public:
   Data operator+(int value) const;
   Data operator+(float value) const;
   Data operator+(string value) const;
};

так яж должен  складывать Data с Data
Тоесть у меня есть массив Data**

Код

void main()
{
    int arr_size;
    Data** datarr;
    
                cout<<"Enter size of array: ";
    cin>>arr_size;
    
   datarr=new Data*[arr_size];
   
    for (int i=0;i<arr_size;i++)
       datarr[i]=InputData();
    for (int i=0;i<arr_size;i++)
        datarr[i]->CheckData();
}


и мне нужно складывать члены этого массива,1ый со 2ым,2ой с 3им и так далее
PM MAIL   Вверх
archimed7592
Дата 14.5.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



grokk, если я правильно понял суть проблемы, то, порекомендую почитать что-нибудь про мультиметоды...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 14.5.2008, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Тогда тебе нужно перегрузить только operator+ для класса Data:
Код
class Data {
...
};

Data operator+(const Data &d1, const Data &d2)
{
...
}
И уже в теле этой функции складывать нужные компоненты.
PM   Вверх
grokk
Дата 15.5.2008, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.5.2008

Репутация: нет
Всего: нет



Цитата(bsa @  14.5.2008,  19:49 Найти цитируемый пост)
6:
7:
8:

class Data {
...
};

Data operator+(const Data &d1, const Data &d2)
{
...
}


я думал про такой способ но тут есть прооблема.Даже если я знаю кем на самом деле являются d1 и d2 мне нужен какойто метод который будет возвращать их значение которое находится в private у каждого класса. я думал прописать абстрактный метод в Data и чтоб он в каждом классе возвращал значения класса,но насколько я понял нельзя чтоб возвращаемое значение было разным. поэтому я в тупике smile 
PM MAIL   Вверх
mes
Дата 15.5.2008, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(grokk @  15.5.2008,  00:14 Найти цитируемый пост)
 мне нужен какойто метод который будет возвращать их значение которое находится в private у каждого класса. я думал прописать абстрактный метод в Data и чтоб он в каждом классе возвращал значения класса,но насколько я понял нельзя чтоб возвращаемое значение было разным

У тебя база для Float, Int и т.д. Data - логично что в виртуальном методе дольны возврашаться не float, int, a некий data ))
то есть обший тип к которому можно преобразовать все твои типы - одной из разновидностью такого является variant . (не его ли ты случайно создаешь ?)
в противном случае решается через мультиметоды - но тогда трудозатраты на подержку кода велики
Чтоб посоветовать конкретней в твоем случае надо понять для чего ты так замудрил ))


--------------------
PM MAIL WWW   Вверх
grokk
Дата 15.5.2008, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.5.2008

Репутация: нет
Всего: нет




Да нет просто наткнулся на такой пример где просили создать такой массив Data и складывать его члены. Вот в качестве самообразования и мучаюсь)
БУду читать про мультиметоды
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0528 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.