Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Перегрузка операторов и полиморфизм


Автор: grokk 13.5.2008, 22:27
Есть массив указателей 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;
}

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

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

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

Автор: grokk 13.5.2008, 23:08
Цитата(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?
сорри за нубские вопросы просто тема виртуальных методов для меня достатачно нов)

Автор: 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;
};

Автор: grokk 14.5.2008, 15:52
Цитата(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им и так далее

Автор: archimed7592 14.5.2008, 19:47
grokk, если я правильно понял суть проблемы, то, порекомендую почитать что-нибудь http://www.google.com/search?q=%D0%BC%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B+%D0%A1%2B%2B...

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

Data operator+(const Data &d1, const Data &d2)
{
...
}
И уже в теле этой функции складывать нужные компоненты.

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

class Data {
...
};

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


я думал про такой способ но тут есть прооблема.Даже если я знаю кем на самом деле являются d1 и d2 мне нужен какойто метод который будет возвращать их значение которое находится в private у каждого класса. я думал прописать абстрактный метод в Data и чтоб он в каждом классе возвращал значения класса,но насколько я понял нельзя чтоб возвращаемое значение было разным. поэтому я в тупике smile 

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

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

Автор: grokk 15.5.2008, 08:34

Да нет просто наткнулся на такой пример где просили создать такой массив Data и складывать его члены. Вот в качестве самообразования и мучаюсь)
БУду читать про мультиметоды

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)