Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменить синтаксис паскаля(делфи) 
:(
    Опции темы
skyboy
Дата 2.6.2008, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(Любитель @  1.6.2008,  22:57 Найти цитируемый пост)
Хотелось бы узнать - что там со статическими полями?

даже во FreePascal сие есть

Добавлено через 4 минуты и 20 секунд
Цитата(Любитель @  1.6.2008,  22:57 Найти цитируемый пост)
что там со статическими полями? В современной дельфе

к примеру, тыц

Добавлено через 5 минут и 19 секунд
оказалось, я все же не от Alexis'a услышал про  static-поля  smile 
PM MAIL   Вверх
Любитель
Дата 2.6.2008, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 5
Всего: 92



Понятно. Буду знать smile


--------------------
PM MAIL ICQ Skype   Вверх
nerezus
Дата 2.6.2008, 06:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 13
Всего: 43



Цитата

В Delphi можно реализовать полноценный Singleton вообще не создавая экземпляра класса.

 smile 


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
MAKCim
Дата 2.6.2008, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата(Alexeis @  1.6.2008,  21:28 Найти цитируемый пост)
Он может все кроме того что связанно с наследованием, даже больше.

структура (record) может содержать методы? 


Цитата(Alexeis @  1.6.2008,  21:28 Найти цитируемый пост)
Большие это те которые содержат вложенные или пронаследованы, т.е. включаются опасные механизмы.

ничего опасного нет
при условии, что язык позволяет осуществлять полное управление жизненным циклом объекта


Цитата(Alexeis @  1.6.2008,  21:28 Найти цитируемый пост)
Все равно не ясно, зачем создавать 2 объекта, при наследовании и так создается только 1 объект В наследник A, объекту A не зачем создаваться, это же наследование, а не композиция.

у нас наследование не обычное
без виртуального механизма будет создано 2 объекта A: по ветке B и ветке C
ладно, проехали, как тут уже сказали, в Delphi нет множественного наследования

Цитата(Alexeis @  1.6.2008,  21:28 Найти цитируемый пост)
Если объект создается в стеке, то его конструктор вызывается в неопределенное время и деструктор тоже, потому его нельзя поместить в блок try...except и правильно отработать исключения. Аналогично происходит в случае глобальных объектов. Кроме того объекты в C++ не инициализируются нулями, потому при возникновении исключения в конструкторе, нельзя вызвать деструктор, так как в последнем невозможно узнать какие из вложенных объектов уже были созданы и соответственно уничтожить только их, ведь если в объекте мусор, то указатели не нулевые.

читай пост Lazin
от себя замечу, что как я и предполагал, плохо и непродуманно Delphi работает со стеком
кроме того, я не получил ответа на вопрос: как куча в Delphi предотвращает возникновение приведенных тобой "проблем"?
тем, что ты явно вызываешь конструктор/деструктор?
извини конечно, но такой подход еще больше увеличивает вероятность ошибок

Цитата(Alexeis @  1.6.2008,  21:28 Найти цитируемый пост)
а в том, чтобы язык не давал лишней возможности для возникновения трудно анализирумых ошибок.

а вот здесь уже на вкус и цвет...


Цитата(Alexeis @  1.6.2008,  21:28 Найти цитируемый пост)
Глупо надеятся что можно писать идеальные программы без ошибок с идеальной структурой, где предусмотрено все на все случаи жизни.  

глупо
но и строгость не панацея



Это сообщение отредактировал(а) MAKCim - 2.6.2008, 09:17


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alexeis
Дата 2.6.2008, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 14
Всего: 459



Lazin, вот пример
Код
void __fastcall TForm1::FormCreate(TObject *Sender)
{

class a
{
   public:
   int _a;

   a(int source)
   {
     throw 1;
   };

   ~a()
   {

   };

};

class b
{
   public:
     a member;

     b() : member(3)
     {

     };

     ~b()
     {

     };
};

b *obj = new b;
}


  Как в этом случае спасти объект b? Его член member при создании вызвал исключение и вышел аварийно, требуется отработать эту ситуацию и пересоздать объект member или вообще отказаться от него.


Цитата(Lazin @  1.6.2008,  21:24 Найти цитируемый пост)
исключения в конструкторах в С++ - нормальное явление, деструкторы для полей объекта вызываются, следуя все тому-же принципу... 
и вообще там все происходит намного интереснее чем ты думаешь, инициализация нулями отношения к делу не имеет никакого =)

  Привожу пример.

Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{

class a
{
   public:
   int smf;

   a(int source)
   {
      smf = source + 1;
   };

   ~a()
   {

   };

};

class b
{
   public:
     a *member1;
     a *member2;
     a *member3;
     a *member4;
     a *member5;

     b()
     {
        member1 = new a(1);
        member2 = new a(2);
        member3 = new a(3);
        throw 1;
        member4 = new a(4);
        member5 = new a(5);
     };

     ~b()
     {
        delete member1;
        delete member2;
        delete member3;
        delete member4;
        delete member5;
     };
};


b *obj = new b;

}


Все члены member1, member2, member3 повисли утечкой, хотя память выделенная под b будет возвращена в кучу. Если бы объект b был предварительно занулен, то для очистки member1 - member3 можно было вызвать деструктор ~b, а так это сделать невозможно, потому что в этом случае возникнет исключение в деструкторе на строчке delete member4; и настанет полный северный пушистый зверек, поэтому в С++ при возникновении исключения в конструкторе никогда не вызывается деструктор.

Цитата(Lazin @  1.6.2008,  21:24 Найти цитируемый пост)
конструкторы копирования и операторы присваивания, никогда небыли источником ошибок

  Источник ошибок не он сам, а его отсутствие по недосмотру. Его просто нужно делать, но не всегда, пока объект простой он может быть не нужным, но в определенный момент при расширении объекта неожиданно поле член заменяется на указатель, все красиво, оно создается в конструкторе, уничтожается в деструкторе, но теперь для копирования такого объекта уже необходим конструктор копирования. Вот этот момент как раз неочевиден, ведь структурно класс почти не изменился.

  Вот это и называется опасный код, не интуитивный код, который приводит к возникновению ошибок.

nerezus, см. ниже после этой фразы, метакласс обладает практически всеми возможностями объекта + синтаксически похож на объект, он сам и есть Синглтон по определению. 

Цитата(MAKCim @  2.6.2008,  08:14 Найти цитируемый пост)
структура (record) может содержать методы? 

Да, в том числе конструкторы с параметрами, свойства и даже операторы.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
skyboy
Дата 2.6.2008, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(MAKCim @  2.6.2008,  08:14 Найти цитируемый пост)
как тут уже сказали, в Delphi нет множественного наследования

есть. но объявления(интерфейса),  а не реализации. через абстрактные классы - т.н. interface
это к обсуждаемому виртуальному наследованию не относится, но уже столько раз звучало про "отсутствие множественного наследования", что не смог промолчать. 
PM MAIL   Вверх
Lazin
Дата 2.6.2008, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(Alexeis @  2.6.2008,  10:06 Найти цитируемый пост)

Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
class a
{
   public:
   int _a;
   a(int source)
   {
     throw 1;
   };
   ~a()
   {
   };
};
class b
{
   public:
     a member;
     b() : member(3)
     {
     };
     ~b()
     {
     };
};
b *obj = new b;
}

создай объект в стеке и вставь в конструкторы - деструкторы брейкпоинты, и ты увидишь что в этом случае деструкторы вызываются
если-бы obj был смарт поинтером, например shared_ptr-ом, то и в твоем примере все будет нормально удалено

Добавлено через 3 минуты и 25 секунд
Цитата(Alexeis @  2.6.2008,  10:06 Найти цитируемый пост)


Код

class b
{
   public:
     a *member1;
     a *member2;
     a *member3;
     a *member4;
     a *member5;
     b()
     {
        member1 = new a(1);
        member2 = new a(2);
        member3 = new a(3);
        throw 1;
        member4 = new a(4);
        member5 = new a(5);
     };
     ~b()
     {
        delete member1;
        delete member2;
        delete member3;
        delete member4;
        delete member5;
     };
};


опять-же, здесь поля объекта - голые указатели, поэтому память освобождена не будет, если-бы это были объекты, то деструкторы были-бы вызваны...
если-бы здесь поля member были-бы смарт поинтерами, то все было-бы корректно удалено

Добавлено через 9 минут и 27 секунд
если написать это развернуто, то получится вот что

Код

     b() :member1(), member2(), member3(), member4(), member5()
     {
        member1 = new a(1);
        member2 = new a(2);
        member3 = new a(3);
        throw 1;
        member4 = new a(4);
        member5 = new a(5);
     };
     ~b()
     {
        delete member1;
        delete member2;
        delete member3;
        delete member4;
        delete member5;
     };


во время раскрутки стека вызываются деструкторы сконструированных объектов в порядке обратном их созданию, тоесть 
Код

member5
member4
member3
member2
member1

если member - голый указатель, то ничего не удалиться, так как у POD типов нет деструкторов, а если смарт поинтер, например auto_ptr, то его деструктор вызовет delete для объекта, который он содержит
PM MAIL Skype GTalk   Вверх
Alexeis
Дата 2.6.2008, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 14
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MAKCim
Дата 2.6.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата(Alexeis @  2.6.2008,  11:14 Найти цитируемый пост)
все верно, но это опять же сделано специально, так как множественное наследование опасный механизм, приводящий к возникновению неочевидных ошибок

никто не заставляет им пользоваться, однако в случае необходимости Delphi будет курить  smile 

по поводу стека, ответом Lazin удовлетворен?  smile  


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alexeis
Дата 2.6.2008, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 14
Всего: 459



Цитата(Lazin @  2.6.2008,  09:39 Найти цитируемый пост)
создай объект в стеке и вставь в конструкторы - деструкторы брейкпоинты, и ты увидишь что в этом случае деструкторы вызываются
если-бы obj был смарт поинтером, например shared_ptr-ом, то и в твоем примере все будет нормально удалено

  Первый код был примером не для утечек, а для исключений. См. выше. Здесь невозможно отработать исключение, с утечками тут все ОК.

Цитата(Lazin @  2.6.2008,  09:39 Найти цитируемый пост)
если member - голый указатель, то ничего не удалиться, так как у POD типов нет деструкторов, а если смарт поинтер, например auto_ptr, то его деструктор вызовет delete для объекта, который он содержит 

  Выходит что без смарт поинтеров о безопасном программировании под С++ можно забыть. Видишь, а в Delphi объекты изначально создавались так чтобы они были с одной стороны простыми в работе, с другой, чтобы были безопасными.

Добавлено через 1 минуту и 17 секунд
Цитата(MAKCim @  2.6.2008,  10:21 Найти цитируемый пост)
никто не заставляет им пользоваться, однако в случае необходимости Delphi будет курить

  В случае необходимости алгоритмы пишут так чтобы обойтись без опасных механизмов. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MAKCim
Дата 2.6.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Alexeis, 
так ты все-таки на вопрос ответь?  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alexeis
Дата 2.6.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 14
Всего: 459



Цитата(MAKCim @  2.6.2008,  10:21 Найти цитируемый пост)
по поводу стека, ответом Lazin удовлетворен?

  Ни чуть. Статические объекты приводят к потере контроля над созданием объектов и невозможности отработки исключений. 

Цитата(Alexeis @  2.6.2008,  09:06 Найти цитируемый пост)
Как в этом случае спасти объект b? Его член member при создании вызвал исключение и вышел аварийно, требуется отработать эту ситуацию и пересоздать объект member или вообще отказаться от него.

  Не услышал ни грамма по этой теме.

Добавлено через 34 секунды
Цитата(MAKCim @  2.6.2008,  10:24 Найти цитируемый пост)
так ты все-таки на вопрос ответь?

  На какой именно?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MAKCim
Дата 2.6.2008, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата(Alexeis @  2.6.2008,  11:22 Найти цитируемый пост)
Здесь невозможно отработать исключение, с утечками тут все ОК.

исключение обработать можно
Код

class b
{
   public:
     a member;
     b() 
     try 
        : member(3) {
     } catch (...) { }

     ~b()
     {
     }
};


Добавлено через 1 минуту и 57 секунд
Цитата(Alexeis @  2.6.2008,  11:25 Найти цитируемый пост)
На какой именно? 


Цитата(MAKCim @  2.6.2008,  09:14 Найти цитируемый пост)
кроме того, я не получил ответа на вопрос: как куча в Delphi предотвращает возникновение приведенных тобой "проблем"?
тем, что ты явно вызываешь конструктор/деструктор?
извини конечно, но такой подход еще больше увеличивает вероятность ошибок


Добавлено через 14 минут и 3 секунды
Цитата(Alexeis @  2.6.2008,  11:25 Найти цитируемый пост)
Не услышал ни грамма по этой теме.

для реализации нужного тебе поведения нужно использовать указатель
в этом вся гибкость С++: можно сделать и так, и так, в зависимости от требуемого поведения


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alexeis
Дата 2.6.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 14
Всего: 459



Цитата(MAKCim @  2.6.2008,  10:27 Найти цитируемый пост)
исключение обработать можно

  Значит остается только опасное копирование по значению, могут быть и другие причины, которые мне неизвестны, но говорить сразу что это глупо излишне самонадеянно. Заметь от этого механизма отказалась даже Microsoft при разработке нового языка C#. Объекты в C# создаются только в куче. Кстати еще вспомнил момент связанный с интерфейсами. После освобождения интерфейса связанный объект должен немедленно уничтожен, а интерфейс ничего не знает создан ли объект в стеке или в куче и соответственно не сможет его удалить. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MAKCim
Дата 2.6.2008, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата(Alexeis @  2.6.2008,  11:45 Найти цитируемый пост)
После освобождения интерфейса связанный объект должен немедленно уничтожен, а интерфейс ничего не знает создан ли объект в стеке или в куче и соответственно не сможет его удалить. 

объект класса с pure virtual методами (применительно к С++) создать нельзя
работа с такими классами осуществляется через указатели/ссылки, т. е через простые типы, а у них нет ни коструктора, ни деструктора
это что касается семантики стека, т. е автоматического удаления при выходе из области видимости
если удаление осуществляется через delete, то, определив в таком классе виртуальный деструктор, мы получим требуемое поведение (т. е удаление реального объекта)

Добавлено @ 11:53
Цитата(Alexeis @  2.6.2008,  11:45 Найти цитируемый пост)
Значит остается только опасное копирование по значению

поведение управляемо через конструктор копий и operator=
где тут что опасно?

Это сообщение отредактировал(а) MAKCim - 2.6.2008, 11:55


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1211 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.