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


Автор: play 2.10.2002, 00:31
#include <iostream>
class CA // базовый класс
{
public:
virtual int GetID() {return 0;};
virtual int GetInt() {return 0;};
virtual double GetFloat() {return 0;};
playnext@narod.ru};

class CB : public CA // для хранения целого типа
{
private:
  int value;
public:
  CB(int _value):value(_value) {};
  virtual int GetID() {return 1;};
  virtual int GetInt() {return value;};
  virtual double GetFloat() {return 0;};
};

class CD : public CA // для хранения вещественного типа
{
private:
  double value;
public:
  CD(double _value):value(_value) {};
  virtual int GetID() {return 2;};
  virtual int GetInt() {return 0;};
  virtual double GetFloat() {return value;};
};

int main(int argc, char* argv[])
{
// 1
  CA *b = new CB(5), *d = new CD(10.05);
  std::cout << b->GetInt() << " + " << d->GetFloat()
     << " = " << b->GetInt() + d->GetFloat() << std::endl;
  delete b; delete d;
  // 2
  b = new CD(4.95); d = new CD(10.05);
  std::cout << b->GetFloat() << " + " << d->GetFloat()
     << " = " << b->GetFloat() + d->GetFloat() << std::endl;
  delete b; delete d;
  return 0;
}

// Как реализовать операцию сложения b и d (для класа CA) чтобы получить
// указатель на CA, который конструируется при помощи CB или CD в зависимости
// от наличия дробной части результата (CD в 1-ом случае, CB во 2-ом)

Автор: cosmic 5.10.2002, 17:26
CA *operator + (CA *b, CA *d)
{
double z = b->GetInt () + d->GetInt () + b->GetFloat () + d->GetFloat ();
return b->GetID () == 2 || d->GetID () == 2 ? new CD (z) : new CB (z);
}

особенно меня порадовал e-mail в теле класса :)

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