Вопросы по ООП (Объектно Ориентированному Программированию ) - страница 9

 
Integer:

Это значит надо будет создавать экземпляр оператором new.
Так я вот одного не пойму. Какие веские причины принуждают к использованию оператора new ? Без него типа никак?
 
hoz:
Так я вот одного не пойму. Какие веские причины принуждают к использованию оператора new ? Без него типа никак?


Он нужен, если требуется динамическое создание объектов. Если заранее неизвестно какое количество объектов потребуется и какие типы объектов.

 
hoz:
Так я вот одного не пойму. Какие веские причины принуждают к использованию оператора new ? Без него типа никак?
Integer:
Он нужен, если требуется динамическое создание объектов. Если заранее неизвестно какое количество объектов потребуется и какие типы объектов.

Можно с помощью динамических массивов классов. В MQL это прокатит. В С++ могут быть проблемы с инициализацией классов членов класса. Поэтому, лучше в массив класть указатель, но не простой, а умный. Чтобы не заморачиваться с инициализацией класса и очисткой памяти.

 
mql5:
class cFather
 {
 public:
 int GetData() {return 3;}
 };
 //+------------------------------------------------------------------+
 //| |
 //+------------------------------------------------------------------+
 class cChild : public cFather
 {
 public:
 int GetData() {return 5;}
 };

 int f(cFather *p) {return p.GetData();}
 //+------------------------------------------------------------------+
 //| |
 //+------------------------------------------------------------------+
 int OnStart()
 {
 cChild obj,*ptr=GetPointer(obj);
 f(ptr); // вернет 3
 ((cFather *)ptr).GetData(); // вернет 3

 return 0;
 }

Как "читается" данная конструкция?

((cFather *)ptr).GetData();

А, в частности:

(cFather *)ptr)
Я вот смотрю, и в упор не втыкаю в суть происходящего...
 
hoz:

Как "читается" данная конструкция?

((cFather *)ptr).GetData();

ptr приводится к типу (классу) cFather и вызывается его (cFather) метод GetData()

как-то так..

 
keekkenen:

ptr приводится к типу (классу) cFather и вызывается его (cFather) метод GetData()

как-то так..

Жесть какая-то... Я так примерно и думал, но.. это уж слишком, что бы приводить к типу (классу). В программировании и так не советуют особо приводить, на сколько я слышал. А тут не то что к стандартному типу приведение, а к классу.

 В общем-то вернёмся ещё разок к этому коду:

class cFather
 {
 public:
 int GetData() {return 3;}
 };
 //+------------------------------------------------------------------+
 //| |
 //+------------------------------------------------------------------+
 class cChild : public cFather
 {
 public:
 int GetData() {return 5;}
 };

 int f(cFather *p) {return p.GetData();}
 //+------------------------------------------------------------------+
 //| |
 //+------------------------------------------------------------------+
 int OnStart()
 {
 cChild obj,*ptr=GetPointer(obj);
 f(ptr); // вернет 3
 ((cFather *)ptr).GetData(); // вернет 3

 return 0;
 }

Здесь в параметрах прототипа функции f чётко видно, что функция f принимает в параметрах метод класса cFather. Далее по коду в СТАРТЕ мы видим следующую ситуацию:

 f(ptr); // вернет 3

Тут уже функция f принимает в параметрах не метод класса cFather, а, судя по всему, указатель на класс cChild. Т.к. cChild obj, *ptr = GetPointer( obj );

Логика в чём? 

 

мм.. логика где ?

в методе f() логика, думаю такова, что входящий параметр будет корректно обрабатываться для cFather (или его наследников)

 
keekkenen:

мм.. логика где ?

в методе f() логика, думаю такова, что входящий параметр будет корректно обрабатываться для cFather (или его наследников)

Т.е.

 int f(cFather *p) {return p.GetData();}

тут *p - указатель на cFather ?

Одновременно, изучаю С++ и меня немного путает схожая лексика. Хотя указатели то тут не те чутка.

 
hoz:

Т.е.

тут *p - указатель на cFather ?

Одновременно, изучаю С++ и меня немного путает схожая лексика. Хотя указатели то тут не те чутка.

cFather - тип указателя. Сама переменная-указатель указывает на экземпляр класса.
 

Уже пару недель как назрел вопросик. Решил задать. Сложности там особо нет, но логически интересно имеет ли место такой вариант. Вот код:

struct Name
  {
   string            first_name;                 // имя
   string            last_name;                  // фамилия
  };
class CPerson
  {
protected:
   Name              m_name;                     // имя
public:
   void              SetName(string n);
   string            GetName(){return(m_name.first_name+" "+m_name.last_name);}
private:
   string            GetFirstName(string full_name);
   string            GetLastName(string full_name);
  };
void CPerson::SetName(string n)
  {
   m_name.first_name=GetFirstName(n);
   m_name.last_name=GetLastName(n);
  }
string CPerson::GetFirstName(string full_name)
  {
   int pos=StringFind(full_name," ");
   if(pos>0) StringSetCharacter(full_name,pos,0);
   return(full_name);
  }
string CPerson::GetLastName(string full_name)
  {
   string ret_string;
   int pos=StringFind(full_name," ");
   if(pos>0) ret_string=StringSubstr(full_name,pos+1);
   else      ret_string=full_name;
   return(ret_string);
  }

Публичные функции в данном коде только 2:

public:
   void              SetName(string n);
   string            GetName(){return(m_name.first_name+" "+m_name.last_name);}

А 2 приватные функции вызываются непосредственно через публичную, а точнее публичной функций, в момент необходимости. Интересно то, что в функции void SetName(string n) параметр n, а в обоих приватных методах private: string GetFirstName(string full_name) и string GetLastName(string full_name) почему-то параметр задан не такой же. Хотя если взять именно этот код (не другой), то здесь данные приватные методы вызываются через публичные с теми же параметрами и иначе никак. Тогда зачем давать параметрам другие имена?

Надеюь вопрос понятен.

Причина обращения: