ООП. Вопросы применения - страница 7

 
equivalent23:

Конечно:

Понял, что проблема заключается в том, как правильно заполнить массив  shapes[10] экземплярами классов, производных от CShape. Предложенный мною вариант почему-то не работает. Давайте думать.
 
Yedelkin:
Понял, что проблема заключается в том, как правильно заполнить массив  shapes[10] экземплярами классов, производных от CShape. Предложенный мною вариант почему-то не работает. Давайте думать.

Массив должен иметь тип указателей на классы, а не тип самого класса.

Тогда можно применять оператор new.

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
AlexSTAL:

Массив должен иметь тип указателей на классы, а не тип самого класса.

Тогда можно применять оператор new.

Можно пример?

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

 
Yedelkin:
Понял, что проблема заключается в том, как правильно заполнить массив  shapes[10] экземплярами классов, производных от CShape. Предложенный мною вариант почему-то не работает. Давайте думать.

Думай, не думай, 100 рублей не деньги.

Пример глючный на все 100, да и подобная реализация или не продумана или не доделана до конца.

Результаты своих экспериментов в коде приводить не буду, дам тока выводы, а он таковы:

1. Если объявить объекты не классами а структурами они спокойно укладываются в массив. Только при этом вируальность придется убрать и появляется возможность работы только с функционалом того типа объектов какой у массива (в данном случае базовый класс);

2. Можно объявить как как указатели, тогда также можно сформировать массив.Но и тут возникают проблемы:

а) при при отсутствии чистки указателей появляется утечка памяти;

б) также невозможно нормально работать с функционалом потомков.

PS

Верней так - функционал который был объявлен в базовом классе доступен, при этом виден и у потомков, а вот все что появилось у самих потомков недоступно.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
AlexSTAL:

Массив должен иметь тип указателей на классы, а не тип самого класса.

Тогда можно применять оператор new.

Да, я тоже думал в этом направлении, насчёт использования указателей. НО тогда не выполняются условия из документации:

"Для квадрата (класс CSquare) площадь вычисляется через стороны, для круга (класс CCircle) площадь выражается через радиус и так далее. Мы можем создать массив для хранения объектов типа CShape, в котором можно будет хранить как объект базового класса, так и всех его потомков. В дальнейшем мы можем вызывать одну и ту же функцию для любого элемента данного массива.

...Так как для вычисления площади квадрата и круга требуются соответствующие значения членов m_radius и m_square_side, то в объявлении соответствующего класса мы добавили функции SetRadius и SetSide(). Теперь мы можем объявить массив типа Shape и заполнить его объектами производных классов..." 

 
AlexSTAL:

Массив должен иметь тип указателей на классы, а не тип самого класса.

Тогда можно применять оператор new.

Не прокатит нормально. Хотя массив сформирует.

Yedelkin:

...Так как для вычисления площади квадрата и круга требуются соответствующие значения членов m_radius и m_square_side, то в объявлении соответствующего класса мы добавили функции SetRadius и SetSide(). Теперь мы можем объявить массив типа Shape и заполнить его объектами производных классов..." 

Вся фишка в том что если массив имеет тип базового класса не выходит получиь доступ к функционалу потомков. т.е. SetRadius() и SetSide() становятся не доступны.

Поэтому пока вижу три варианта:

1. массив должен быть однородным (по возможности);

2. Я чего-то не понимаю в философии и архитектуре  ООП для MQL5;

3. разработчики либо превери нерабочий примерЮ либо не дожали вопрос до конца.>

 
Interesting:
Не прокатит нормально. Хотя массив сформирует.
Что значит нормально не прокатит?
 
Interesting:

Верней так - функционал который был объявлен в базовом классе доступен, при этом виден и у потомков, а вот все что появилось у самих потомков недоступно.

Во-во, именно с этим и столкнулся.

Interesting:

Пример глючный на все 100 ...

 Получается, что необходим ответ авторов Справочника на эту тему.

 
Interesting:
Не прокатит нормально. Хотя массив сформирует.

Вся фишка в том что если массив имеет тип базового класса не выходит получиь доступ к функционалу потомков. т.е. SetRadius() и SetSide() становятся не доступны.

Поэтому пока вижу три варианта:

1. массив должен быть однородным (по возможности);

2. Я чего-то не понимаю в философии и архитектуре  ООП для MQL5;

3. разработчики либо превери нерабочий примерЮ либо не дожали вопрос до конца.>

Выполняйте:

class CBase
  {
public:
   void m_radius() {Print("CBase");}
  };

class CTest : public CBase
  {
public:
   void m_radius() {Print("CTest");}
  };

CBase* Base;

void OnStart()
  {
   Base = new CTest;
   Base.m_radius();
   ((CTest *)Base).m_radius();
   delete Base;
  }

можно сделать намного проще... виртуализацией:

class CBase
  {
public:
   virtual void m_radius() {Print("CBase");}
  };

class CTest : public CBase
  {
public:
   virtual void m_radius() {Print("CTest");}
  };

CBase* Base;

void OnStart()
  {
   Base = new CTest;
   Base.m_radius();
   delete Base;
  }
 
AlexSTAL:
Что значит нормально не прокатит?

1. Функционал потомков не доступен. Не знаю кто и как, но лично я доступ к SetRadius() и SetSide() из Массива так и не получил.Может там есть путь как проблему решить автогеном, но хочется без этого.

2. Может я с указателями не так работаю, но у меня либо утечка вылазит постоянно либо приходится бить указатели сразу в том блоке где идет основная работа.

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