Feature request: copy constructor

 

Вобщем, я долго думал, как обойти три основные текущие проблемы языка, не позволяющие создавать действительно большие проекты:

- отсутствие множественного наследования

- невозможность копирования

- отсутствие нормальных конструкторов.

Первое решается (отчасти) тщательным проектированием и отсутствием промежуточных доступных для использования имплементаций.

Второе и третье можно довольно красиво решить, добавив один единственный  конструктор, кроме по умолчанию -- копирующий.

Если я что-то пропустил (не слежу за развитием терминала уже месяц), скажите, я прикрою тему.

Скажем, невозможность отсортировать массив простейших объектов меня удручает. Примеров масса. А с копирующим конструктором все(м) станет намного лучше.

Мало надеюсь на реализацию, но по крайней мере высказался.

 

Я пока в этих структурах. классах.... вообще не могу разобраться. Незнаю Андрей может это хоть как то поможет

//+-------------------------------------------------------------------------------+
//| Квадратичный алгоритм сортировки подсчётом                                    |
//| http://ru.wikipedia.org/wiki/Сортировка_подсчётом                             |
//+-------------------------------------------------------------------------------+
//| a[] - входной массив данных; b[] - выход (номер по порядку)                   |
//+-------------------------------------------------------------------------------+
void   SquareCountingSort(double& a[], int& b[]) {
      int   n=ArraySize(a);
      for(int i = 0; i < n; i++)
         {
         int c = 0;
         for(int j = 0; j < n; j++)
            {
            if(a[j] < a[i])  c++;
            }
         for(int j = 0; j < i ; j++)
            {
            if(a[i] == a[j]) c++;
            }
         b[i]=n-c-1; //если b[c] = a[i] то на выходе не номер, а отсортированный массив
         }
}

 

 
TheXpert:

Вобщем, я долго думал, как обойти три основные текущие проблемы языка, не позволяющие создавать действительно большие проекты:

- отсутствие множественного наследования

- невозможность копирования

- отсутствие нормальных конструкторов.

Первое решается (отчасти) тщательным проектированием и отсутствием промежуточных доступных для использования имплементаций.

Второе и третье можно довольно красиво решить, добавив один единственный  конструктор, кроме по умолчанию -- копирующий.

Если я что-то пропустил (не слежу за развитием терминала уже месяц), скажите, я прикрою тему.

Скажем, невозможность отсортировать массив простейших объектов меня удручает. Примеров масса. А с копирующим конструктором все(м) станет намного лучше.

Мало надеюсь на реализацию, но по крайней мере высказался.

Да копирующего конструктора нет и это плохо,

как вариант можно создать сортирующий int массив и ему присваивать индексы-имена объектов,

а затем при поиске в отсортированом пространстве просто использовать его как декодер,

но это конечно не решает проблему в корне а лишь ставит заплатку.

Опять новая заплатка.

 
TheXpert:

Скажем, невозможность отсортировать массив простейших объектов меня удручает.

Ничего что базовый класс CObject предусматривает метод Compare? Сортировку-то написать дело минуты-двух.
 
lea:
Ничего что базовый класс CObject предусматривает метод Compare? Сортировку-то написать дело минуты-двух.

Допустим у нас имеется массив указателей и мы отработали одну итерацию, те все обьекты умеют выходные данные(целевую функцию)

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

Так вот без возможности копирования обьектов у вас ничего не получится, возможно вы справитесь с сортировкой (я даже уверен в этом)

и уничтожите ненужные обьекты, и что в результате ?

а в результате вы получите дырявый массив указателей в котором есть пустые места,

для создания под этими именами новых обьектов, но они идут не подряд а как попало. Так что проблемка та ещё.

 
Urain:

Допустим у нас имеется массив указателей и мы отработали одну итерацию, те все обьекты умеют выходные данные(целевую функцию)

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

Так вот без возможности копирования обьектов у вас ничего не получится, возможно вы справитесь с сортировкой (я даже уверен в этом)

и уничтожите ненужные обьекты, и что в результате ?

а в результате вы получите дырявый массив указателей в котором есть пустые места,

для создания под этими именами новых обьектов, но они идут не подряд а как попало. Так что проблемка та ещё.

Зачем перемещать данные, если можно перемещать указатели на них?

Каждый такой массив указателей отсортированный определённым образом можно назвать индексом.
Вы можете один и тот же массив данных отсортировать несколькими способами, используя несколько индексов.

Самый простой пример - библиотека. Книги стоят на своих полках по алфавиту. В библиотеке решили разложить книги по рейтингу.
Так вот самый простой способ для библиотеки это завести каталог (ящик с карточками содержащими описание и местоположением книг на полках)
отсортированный по популярности, никакого физического перемещения книг нет. Вы же предлагаете постоянно перемещать книги.

Если библиотека хочет исключить некоторые книги (например из-за их утери), то достаточно изъять соответствующую карточку из картотеки.
И опять, никакого перемещения книг на полках - сдвигаются карточки, что сделать намного проще.

 
mql5:
Зачем перемещать данные, если можно перемещать указатели на них?

Вы специально издеваетесь?

Даже без учета того, что сам указатель -- это чуть ли не основной костыль MQL5.

Покажите мне в нормальном ЯВУ работу с чистым указателем -- все работают с умными. А передача данных по указателю -- это потеря контроля за его содержимым.

Пусть даже у вас встроенный сборщик мусора, полностью от утечек это не поможет.

Неужели вы сами не видите, насколько корявыми получились ваши объекты?

lea:
Ничего что базовый класс CObject предусматривает метод Compare? Сортировку-то написать дело минуты-двух.
Про стандартную библиотеку я вообще предпочту не высказываться.
 
mql5:
Зачем перемещать данные, если можно перемещать указатели на них?

Каждый такой массив указателей отсортированный определённым образом можно назвать индексом.
Вы можете один и тот же массив данных отсортировать несколькими способами, используя несколько индексов.

Самый простой пример - библиотека. Книги стоят на своих полках по алфавиту. В библиотеке решили разложить книги по рейтингу.
Так вот самый простой способ для библиотеки это завести каталог (ящик с карточками содержащими описание и местоположением книг на полках)
отсортированный по популярности, никакого физического перемещения книг нет. Вы же предлагаете постоянно перемещать книги.

Если библиотека хочет исключить некоторые книги (например из-за их утери), то достаточно изъять соответствующую карточку из картотеки.
И опять, никакого перемещения книг на полках - сдвигаются карточки, что сделать намного проще.

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

Тут как минимум требуется возможность переименовыват обьекты. А такого я тоже не наблюдаю.

ЗЫ хотя в принципе проблема решается через структуру копирования,

суть обьекта это состояние всех его данных прописав в деструкторе выгрузку данных ,

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

ЗЗЫ Только нужно внимательно смотреть что всё до последнего захудалого счётчика сохранилось.

 
Urain:

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

По Вашем постам понял, что удалять хотите вторую половину индекса по целевой функции и на место аутсайдеров добавить новые

//--- обработка объектов
DoSomething(index);
//---- сортируем по целевой функции
SomeSort(index);
//--- можно удалять аутсайдеров и на их место поселить новых
int n=ArraySize(index);
for(int i=n/2;i<n;i++)
  {
   delete index[i];
   index[i]=CreateNewObject(<parameters for new object>);
  }



 

Копирующий конструктор мало чем отличается от обычной функции void CSomeObject::Copy(CSomeObject &obj), разве что удобством прямого присвоения obj1=obj2 вместо obj1.Copy(obj2).

Так как шаблонов в MQL5 нет, то многие удобности C++ языка отсутствуют. И это не проблема для прикладного языка.

 
Renat:

Копирующий конструктор мало чем отличается от обычной функции void CSomeObject::Copy(CSomeObject &obj), разве что удобством прямого присвоения obj1=obj2 вместо obj1.Copy(obj2).

Однако... Стоимость отсутствия этого "удобства", как изволите его называть -- миллионы нервных клеток.

Вот Вы мне скажите -- а нафига было делать конструктор по умолчанию?

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

А давайте вспомним про инкапсуляцию! Один из трех китов ООП.

Для того, чтобы закрыть протечку ООП в виде отсутствия копи-конструктора и сделать это в виде функции, необходимо разрешить (какой-никакой, но) доступ ко всем, в том числе и приватным членам. Альтернатива? Нет, страшный костыль.

Так как шаблонов в MQL5 нет, то многие удобности C++ языка отсутствуют. И это не проблема для прикладного языка.

Причем здесь шаблоны? В С++ это вообще отдельная парадигма, не связанная с другими. Я не прошу ничего невозможного -- всего лишь разрешить копирование объектов. И организовать его в виде поэлементного копирования. Всё!

И что получается в итоге? Все принципы хваленого и разрекламированного ООП на поверку текут так, что более менее сложная  конструкция обречена потонуть в муках, так и не оказавшись на плаву.

На самом деле мне очень горестно озвучивать все вышесказанное, так как я надеялся нет, не на подобие С++, но на нормальную реализацию языка без хотя бы явных костылей.