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

Поиск:

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


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 2
Всего: 134



Цитата(Alexeis @  1.6.2008,  18:04 Найти цитируемый пост)

  Делается, но несколько иным образом через array of const, при этом число параметров получается автоматически. Кстати в С++ нельзя получить число элементов динамического массива, типа High(mas)  

Да? А std::vector<t>::size() для кого?

Добавлено через 4 минуты и 3 секунды
Кстати в паскале нельзя вычислить факториал в compile time.

ps. а в си++ нельзя вычслить синус - 
Код

 template<double x> class Z; //"ComeauTest.c", line 1: error: floating-point template parameter is nonstandard

но тссс, это секрет.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 1.6.2008, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(Mayk @  1.6.2008,  13:34 Найти цитируемый пост)
Да? А std::vector<t>::size() для кого?

  Так это ж класс...


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

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

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


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(Alexeis @  1.6.2008,  15:53 Найти цитируемый пост)
  Так это ж класс...

это стандартная замена массива


--------------------
Мой блог
PM MAIL WWW   Вверх
Любитель
Дата 1.6.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Mayk @  31.5.2008,  15:56 Найти цитируемый пост)
Если это появится раньше полноценных замыканий/лямбд в дельфи (кстати как с этим в дельфи.нет?)  то это смерти подобно

ИМХО Дельфям глубоко плевать на ФП.

Цитата(Alexeis @  31.5.2008,  16:13 Найти цитируемый пост)
В Delphi можно реализовать полноценный Singleton вообще не создавая экземпляра класса.

 smile 

Цитата(Alexeis @  31.5.2008,  19:01 Найти цитируемый пост)
В таком как в примере это никому и не нужно. При наследовании виртуальной функции, можно запретить предкам начиная с определенного колена вызывать виртуальную функцию того класса, который реально создан. Т.е. в одном из наследников вводиться новый виртуальный метод, точно такой же как и прежний, но с директивой reintroduce, после чего в таблицу VMT вводиться новая запись, а старая остается. Т.о. можно добиться разных действий, в зависимости от того к какому из предков был приведен объект. Довольно тонкий механизм, но в VCL используется.

Смысл непонятен. Только проблемы ИМХО smile

Цитата(Alexeis @  31.5.2008,  19:01 Найти цитируемый пост)
При этом он является классом обычных объектов, в том смысле, что создает объекты и объекты этого класса имеют доступ ко всем статическим полям и функциям.

Стоп. А в Дельфи разве есть статические поля?

Цитата(MAKCim @  1.6.2008,  11:44 Найти цитируемый пост)
4. есть ли аналог элипсисов? (оператор ...)

В С++ они унаследованы от С, потому в оч недобном виде. Ими, по-моему, никто не пользуется (в плюсах).

Цитата(MAKCim @  1.6.2008,  11:44 Найти цитируемый пост)
6. есть ли аналог объединений? (union)

Записи с вариантами?

Цитата(MAKCim @  1.6.2008,  11:44 Найти цитируемый пост)
9. есть ли аналог виртуального наследования?

Дык множественного ж вроде нет - зачем виртуальное?!

Цитата(MAKCim @  1.6.2008,  11:44 Найти цитируемый пост)
11. есть ли аналог спецификатора restrict?

Немного оффтоп. Какие компилеры на сегодня юзают рестрикт для оптимизации?

Цитата(Lazin @  1.6.2008,  12:32 Найти цитируемый пост)
13. есть ли аналог модификатора const для параметров функций

Да - const smile Причём AFAIK для 32-битных (или меньше) типов аналогично передачи по значению. Иначе - константная ссылка.

Цитата(Lazin @  1.6.2008,  12:32 Найти цитируемый пост)
18. можно-ли реализовать сборку мусора, используя только возможности стандартных библиотек

Delphi .Net? smile 

Цитата(Alexeis @  1.6.2008,  12:49 Найти цитируемый пост)
2. можно ли определить свой аллокатор для класса? (аналог перегрузки new в С++)
Угу.

AFAIK только глобально. Разве я не прав?

Цитата(Alexeis @  1.6.2008,  12:49 Найти цитируемый пост)
Только классические паскалевские (не VCL ские)

Эт которые с object вместо class? Если да - тогда фтопку, точно не помню, но помню, что это нечто кривое и недоделанное smile

Цитата(Alexeis @  1.6.2008,  14:04 Найти цитируемый пост)
 В этом смысле существует несколько другой механизм. Механизм ReadOny и WriteOnly свойств, ограничивающих возможность изменения состояния объекта.

А какое отношение это имеет к mutable?

Цитата(Alexeis @  1.6.2008,  14:04 Найти цитируемый пост)
Очень деже неплохо, стековые объекты нарушают концепцию безопасности ООП в Delphi. Этот механизм неэффективен для больших объектов, а маленькие стековые объекты есть, это Record. Все четко разделено. Объект маленький - делай Record это будет быстро  + копирование по значению, большой - делай в куче.

Нелогично smile 

Цитата(W4FhLF @  1.6.2008,  14:25 Найти цитируемый пост)
Можно пример? Мне кажется, что использование массивов к эллипсису никакого отношения не имеет. 

Нетипизрованный массив, если я правильно понял, как-то можно в дельфях передавать в функцию. Как затем юзать - фиг его smile

Цитата(Mayk @  1.6.2008,  14:34 Найти цитируемый пост)
Кстати в паскале нельзя вычислить факториал в compile time.

Ну, в С++ тоже много чего нельзя в компайл-тайм (не тот язык всё-таки) - так что кодогенераторы рулят smile 

Насчёт виртуальных конструкторов и виртуальных статических методов - респект. Гуд smile

ЗЫ Блин, хорошая вещь холивары smile 


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


Inspired =)
***


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

Репутация: нет
Всего: 191



Цитата(W4FhLF @  1.6.2008,  21:25 Найти цитируемый пост)
Можно пример? Мне кажется, что использование массивов к эллипсису никакого отношения не имеет. 

В справочной системе приведен пример:
Код

function MakeStr(const Args: array of const): string;
var
  I: Integer;
begin
  Result := '';
  for I := 0 to High(Args) do
    with Args[I] do
      case VType of
        vtInteger:    Result := Result + IntToStr(VInteger);
        vtBoolean:    Result := Result + BoolToStr(VBoolean);
        vtChar:       Result := Result + VChar;
        vtExtended:   Result := Result + FloatToStr(VExtended^);

        vtString:     Result := Result + VString^;
        vtPChar:      Result := Result + VPChar;
        vtObject:     Result := Result + VObject.ClassName;
        vtClass:      Result := Result + VClass.ClassName;
        vtAnsiString: Result := Result + string(VAnsiString);
        vtCurrency:   Result := Result + CurrToStr(VCurrency^);
        vtVariant:    Result := Result + string(VVariant^);
        vtInt64:      Result := Result + IntToStr(VInt64^);
    end;
end;

//Calling
MakeStr(['test', 100, ' ', True, 3.14159, TForm])

Для последней версии Dephi можно для прохода использовать оператор for..in..do
Код

function MakeStr(const ADynArray: array of const): string;
var
  lRec: TVarRec;
begin
  Result := '';
  for lRec in ADynArray do
    case lRec.VType of
      vtInteger: Result := Result + IntToStr(lRec.VInteger) + sLineBreak;
      vtString : Result := Result + string(lRec.VString^) + sLineBreak;
      vtPointer: Result := Result + '$'+IntToHex(Integer(lRec.VPointer), 4) + sLineBreak;
      vtAnsiString: Result := Result + PChar(lRec.VAnsiString) + sLineBreak;
    end;
end;

Цитата(Lazin @  1.6.2008,  19:32 Найти цитируемый пост)
12. есть ли аналог ссылок

Прямого аналога нет, но для вызовов функций, там, где в С++ любят использовать ссылки, используется оператор @

Это сообщение отредактировал(а) Rrader - 1.6.2008, 17:42


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
W4FhLF
Дата 1.6.2008, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 2
Всего: 121



Цитата(Rrader @  1.6.2008,  17:41 Найти цитируемый пост)
В справочной системе приведен пример:


Действительно, хорошая штука smile


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Alexeis
Дата 1.6.2008, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(Любитель @  1.6.2008,  16:21 Найти цитируемый пост)
AFAIK только глобально. Разве я не прав?

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

Цитата(Любитель @  1.6.2008,  16:21 Найти цитируемый пост)
Эт которые с object вместо class? Если да - тогда фтопку, точно не помню, но помню, что это нечто кривое и недоделанное

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

Цитата(Любитель @  1.6.2008,  16:21 Найти цитируемый пост)
А какое отношение это имеет к mutable?

  Как я понял это механизм ограничения доступа к полям данных. Тут оно работает несколько другим образом. Доступ к свойству можно ограничить или расширить в наследнике, передавая объект как предка. В отличие от С++, здесь можно свойство поднять из private в public, при необходимости в наследнике расширить доступ к свойству или функции. Нельзя требовать от языка, чтобы он полностью повторял механизмы другого. В замен одного механизма может быть совершенно другой или два заменяют один. Соответвтенно алгоритмы и структура программы строиться по другому. Так вот ограничить часть свойств так чтобы их нельзя было изменить при передаче в функцию возможно.

Цитата(Любитель @  1.6.2008,  16:21 Найти цитируемый пост)
Нелогично 

Что именно нелогично? То что если внутри объекта возникнет исключение, то вся динамическая память которая была выделена до того повиснет ввиде утечки? Это логично? Или логично, то что проверка принадлежности указателя на базовый класс к наследнику при помощи is пройдет, а попытка использования базового как наследника при помощи as провалиться в исключение, потому что видите ли это не первый базовый класс, а лишь второй, а второй базовый уже для этого не годиться. Или то что при присваивании стековых объектов поля копируются лишь бинарно, потому все внутренние объекты созданные в куче будут одним, а потом, когда уничтожат второй объект, деструтктор упадет на AV потому что объект поле был у них общим и его уничтожил первый владелец, а второй уже удаляет мусор. Чего дальше перечислять все особенности "безопасной" работы с объектами в С++? Или все таки согласишься, что большой объект должен иметь встроенные механизмы безопасности, а простой можно создавать хоть у черта на рогах. Будте уверены, что создание объектов в куче это не глупое ограничение, а серьезный механизм безопасности и исключения случайных ошибок при работе с памятью.

Добавлено через 2 минуты и 15 секунд
Цитата(Rrader @  1.6.2008,  16:41 Найти цитируемый пост)
Прямого аналога нет, но для вызовов функций, там, где в С++ любят использовать ссылки, используется оператор @

  var параметр это как раз такой параметр, который передается по ссылке, а @ это аналог &


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

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

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


Опытный
**


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

Репутация: нет
Всего: 2



Mayk, спасибо за максимально полный ответ и за то что он по теме =)

Цитата
Со скобками есть проблема. При компиляции сторонних .pas файлов могут возникнуть Серьезные Проблемы из-за того что {комменты} будут третироваться как код.


да, я думал над этим. я бы написал программку которая конвертирует исходники под мой синтаксис, это не сложно.

Цитата

Можешь ещё попробовать настроить Текстовой Редактор чтобы по нажатию на { вставлялось begin и по нажатитю на } - end.
Правда удалять их одной клавишей затрундительно.


Как вариант подходит, но крайне удобно перед каждой компиляцией это проделовать. даже через батник будет не то  smile 

Еще подумаю может чего придумаю.



--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
skyboy
Дата 1.6.2008, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Burka @  1.6.2008,  18:11 Найти цитируемый пост)
я бы написал программку которая конвертирует исходники под мой синтаксис, это не сложно.

вот-вот. делаешь внешний препроцессор в виде расширения ide и подключаешь к среде разработки ;) уж извини, для таких экзотических требований готовых решений либо нет, либо совсем уж никому неизвестные.
Цитата(Любитель @  1.6.2008,  16:21 Найти цитируемый пост)
Эт которые с object вместо class? Если да - тогда фтопку, точно не помню, но помню, что это нечто кривое и недоделанное

ну, скажем так: после привычной модели штука выглядит... .ээээ... коряво. но если уж сильно хочется иметь в стеке объект - то решение есть. разве нет?
Цитата(Любитель @  1.6.2008,  16:21 Найти цитируемый пост)
Стоп. А в Дельфи разве есть статические поля?

статические методы есть и в 6(насколько помню, работать начал с 7-ки). статические поля, насколько помню, уже в BDS 2005 есть. кстати, об этом узнал от Alexis'a, так что он точно скажет.

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


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


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

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



Цитата(Alexeis @  1.6.2008,  14:04 Найти цитируемый пост)
Это вообще, не имеет отношения к языку. Скорее директива определенного компилятора.

это, как уже заметили, стандарт
в низкоуровневом коде volatile встречается повсеместно

Цитата(Alexeis @  1.6.2008,  14:04 Найти цитируемый пост)
Кстати в С++ нельзя получить число элементов динамического массива, типа High(mas)

потому что в С/С++ нет понятия динамического массива  smile 
нет вообще динамических массивов
есть указатели
указатели относятся к простым типам данных

я даю 95%, что динамический массив в Delphi - это ни что иное, как объект соответствующего класса, только он завуалирован синтаксисом Delphi, т. е по сути является встроенным
приведи ассемблерный листинг функции, работающей с динамическим массивом, сразу все станет видно


Цитата(Alexeis @  1.6.2008,  14:04 Найти цитируемый пост)
В этом смысле существует несколько другой механизм. Механизм ReadOny и WriteOnly свойств, ограничивающих возможность изменения состояния объекта.

не то
вот пример mutable
Код

class a {
private:
    mutable int b;
public:
    void c() const {
       b = 0; // можем изменять несмотря на то, что метод константный
    }
};



Цитата(Alexeis @  1.6.2008,  14:04 Найти цитируемый пост)
 Класс будет использовать объект  smile . Чета тут перемудрили ИМХО.

скажем так, при создании объекта D, создается только один объект A

Цитата(Alexeis @  1.6.2008,  14:04 Найти цитируемый пост)
Этот механизм неэффективен для больших объектов,

больших это сколько?

Цитата(Alexeis @  1.6.2008,  14:04 Найти цитируемый пост)
Все четко разделено. Объект маленький - делай Record это будет быстро  + копирование по значению, большой - делай в куче.

а если объект маленький, но структурой не представим (нужна семантика класса)?  smile 
не гибко и притянуто за уши

Цитата(Любитель @  1.6.2008,  17:21 Найти цитируемый пост)
Немного оффтоп. Какие компилеры на сегодня юзают рестрикт для оптимизации?

GCC


Цитата(Alexeis @  1.6.2008,  18:57 Найти цитируемый пост)
То что если внутри объекта возникнет исключение, то вся динамическая память которая была выделена до того повиснет ввиде утечки? Это логично?

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


Цитата(Alexeis @  1.6.2008,  18:57 Найти цитируемый пост)
Или то что при присваивании стековых объектов поля копируются лишь бинарно, потому все внутренние объекты созданные в куче будут одним, а потом, когда уничтожат второй объект, деструтктор упадет на AV потому что объект поле был у них общим и его уничтожил первый владелец, а второй уже удаляет мусор. Чего дальше перечислять все особенности "безопасной" работы с объектами в С++?

это все от того, что в Delphi нет конструкторов копирования, перегрузки operator= и т. д smile 
в С++ настраивается любое поведение

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

это именно глупое ограничение (читать абзац выше)


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

PM MAIL   Вверх
Burka
Дата 1.6.2008, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 2



skyboy, расширения ide - ты имеешь виду что то типа плагина делать для делфи или просто прогу отдельную. 
И вообще как плагины делать? Где про них понятней написано?

Это сообщение отредактировал(а) Burka - 1.6.2008, 20:40


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
Alexeis
Дата 1.6.2008, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(MAKCim @  1.6.2008,  18:45 Найти цитируемый пост)
а если объект маленький, но структурой не представим (нужна семантика класса)?  smile 
не гибко и притянуто за уши

  Он может все кроме того что связанно с наследованием, даже больше.

Цитата(MAKCim @  1.6.2008,  18:45 Найти цитируемый пост)
больших это сколько?

Большие это те которые содержат вложенные или пронаследованы, т.е. включаются опасные механизмы.
 
Цитата(MAKCim @  1.6.2008,  18:45 Найти цитируемый пост)
скажем так, при создании объекта D, создается только один объект A

  Все равно не ясно, зачем создавать 2 объекта, при наследовании и так создается только 1 объект В наследник A, объекту A не зачем создаваться, это же наследование, а не композиция.

Цитата(MAKCim @  1.6.2008,  18:45 Найти цитируемый пост)
а причем здесь стек и куча?
если объекты в куче выделяются ничего не повиснет?


  Это часть общего механизма безопасности объектов. Если объект создается в стеке, то его конструктор вызывается в неопределенное время и деструктор тоже, потому его нельзя поместить в блок try...except и правильно отработать исключения. Аналогично происходит в случае глобальных объектов. Кроме того объекты в C++ не инициализируются нулями, потому при возникновении исключения в конструкторе, нельзя вызвать деструктор, так как в последнем невозможно узнать какие из вложенных объектов уже были созданы и соответственно уничтожить только их, ведь если в объекте мусор, то указатели не нулевые. Исключение в конструкторах для Delphi это не критическая ситуация, а механизм сигнализации о неверных параметрах.
  
Цитата(MAKCim @  1.6.2008,  18:45 Найти цитируемый пост)
это все от того, что в Delphi нет конструкторов копирования, перегрузки operator= и т. д smile 
в С++ настраивается любое поведение

  Все в Delphi есть, но дело не в том что можно все сделать правильно, а в том, чтобы язык не давал лишней возможности для возникновения трудно анализирумых ошибок. Можно все делать правильно, но факт остается фактом, что ошибки в программах исправляются годами и количество совершаемых в средней программе исчисляется сотнями, потому задача языка свести к миниму возможности появления.
  При разработке программы не исходят из того, что в ней не будет ошибок, порядочный программист при написании программы должен понимать что ошибки будут, однозначно будут, их не избежать и нужно так спланировать написание ПО, чтобы все ошибки легко находились, поэтому безопасность ООП это не последнее дело в программировании.

Цитата(MAKCim @  1.6.2008,  18:45 Найти цитируемый пост)
это именно глупое ограничение (читать абзац выше)

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


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

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

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


Эксперт
****


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

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



Цитата(Alexeis @  1.6.2008,  18:57 Найти цитируемый пост)
Что именно нелогично? То что если внутри объекта возникнет исключение, то вся динамическая память которая была выделена до того повиснет ввиде утечки? Это логично?


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

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

....
{
  Bar bar();//здесь происходит вызов конструктора bar
  {
     Foo fоо(); //здесь то-же происходит вызов конструктора foo
     ....
     //здесь вызывается деструктор foo
  }
  //объект foo, здесь уже гарантировано уничтожен, можно на это расчитывать
}
//здесь вызывается деструктор bar

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

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

Код

class Mutex
{
  public:
  void enter();//захватить мьютекс
  void leave();//освободить мьютекс
};


обычный способ его использования

Код

mutex.enter();
...работаем с общими данными
mutex.leave();


если между вызовами enter и leave, произойдет исключение, то это приведет к блокировке программы, все встанет колом smile 

так вот, можно описать такой класс

Код

class scope_locker
{
  Mutex& mutex_;
public:
  //конструктор
  scope_locker(Mutex& m) : mutex_(m) { mutex_.enter(); } //захватываем мьютекс
  //деструктор
  ~scope_locker() { mutex_.leave(); }//освобождаем мьютекс
};

это все))

теперь в коде можно писать вот так
Код

{
.....
//здесь мьютекс освобожден
  {
     scope_locker(mutex);//здесь вызовется метод enter мьютекса
     //делаем здесь что угодно
  } //здесь будет вызван метод leave мьютекса, даже если происходит раскрутка стека, после исключения
//здесь мьютекс освобожден
}

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

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

конструкторы копирования и операторы присваивания, никогда небыли источником ошибок smile 

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

модульные тесты не помогают? smile 
PM MAIL Skype GTalk   Вверх
skyboy
Дата 1.6.2008, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



господа, а почему, собственно, обсуждение не продолжается в pascal vs с++?!
зачем нам клоны?
PM MAIL   Вверх
Любитель
Дата 1.6.2008, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(MAKCim @  1.6.2008,  19:45 Найти цитируемый пост)
я даю 95%, что динамический массив в Delphi - это ни что иное, как объект соответствующего класса, только он завуалирован синтаксисом Delphi, т. е по сути является встроеннымприведи ассемблерный листинг функции, работающей с динамическим массивом, сразу все станет видно

Вообщем-то да. Компилер вставляет вызовы внутренних функций рантайма. Даже присваивание для них переопределено (работает reference counting, в частности).

Цитата(MAKCim @  1.6.2008,  19:45 Найти цитируемый пост)
а если объект маленький, но структурой не представим (нужна семантика класса)?   не гибко и притянуто за уши

+1

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

Красиво сказал smile

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

А чем эт они опасны?!

Цитата(skyboy @  1.6.2008,  23:24 Найти цитируемый пост)
господа, а почему, собственно, обсуждение не продолжается в pascal vs с++?!

Новая эпоха smile 

Хотелось бы узнать - что там со статическими полями? В современной дельфе. Для общего развития smile


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

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

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


 




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


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

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