
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.52] |
![]() |
|
Страницы: (117) « Первая ... 110 111 [112] 113 114 ... 116 117 ( Перейти к последнему сообщению ) |
Сообщ.
#1666
,
|
|
|
Цитата Flex Ferrum @ А то "Абстрактные классы! Абстрактные классы!" А тут оказывается, что C++ с его "эмуляцией" интерфейсов предоставляет несколько, гм, большую гибкость, нежели Delphi с ее явно выделенной для этого сущностью. Да нет, чем большую-то? Можно в С++ взять готовую двоичную реализацию интерфейса и использовать в своем классе? Delphi - может. |
Сообщ.
#1667
,
|
|
|
Ответ новичка не знающего Делфи: ![]() ![]() char* pCh = "test"; pCh++; |
Сообщ.
#1668
,
|
|
|
Цитата Flex Ferrum @ По этому стандартный класс (который std::basic_string) реализует необходимый минимум функционала, который может потребоваться от строк, дабы покрыть наиболее широкий спектр задач, в которых он может понадобиться (следуя тому же принципу zero-cost features). Различного рода специализированные библиотеки (наподобие того же Qt или xerces) предлагают свои реализации строки, которые содержат функции, специфичные для той предметной области, в которой эти библиотеки будут применяться. Один вопрос: QString - потомок std::basic_string? |
Сообщ.
#1669
,
|
|
|
Цитата А если бы он присваивался автоматом - я бы так сделать не смог А если бы он присваивался автоматом только в том случае, если я его не назначил сам? Ведь Flex Ferrum прав в том смысле, что в своих проектах от COM я далек. Но IID интерфейсам назначаю, лишь потому, что знаю, что без них нет возможности идентифицировать интерфейс НИКАК. Я не смогу полноценно использовать оператор as, так как компилятор для таких интерфейсов не создает никаких уникальных идентификаторов в IntfTable, и TObject.GetInterface не знает, что ему в этом RTTI искать ![]() Это действительно недочет компилятора, так как меня, как разработчика, в случае когда я не собираюсь использовать чужие интерфейсы, не должно волновать, как Delphi их идентифицирует. |
Сообщ.
#1670
,
|
|
|
Цитата Romkin @ Нет. Просто интерфейсы изначально предельно оторваны от реализации. И Delphi не важно, как и когда был написан программный модуль, из которого взят интерфейс. То есть, допустим, у меня есть dll, из которой я получаю ссылку интерфейс (неважно, каким способом). Мне совершенно не интересно, на какой версии компилятора Delphi написана эта библиотека, да и на Delphi ли. Компилятор будет, опираясь на имеющееся описание интерфейса в моем модуле, работать с полученной ссылкой. А какое описание брать - он поймет по IID. А если бы он присваивался автоматом - я бы так сделать не смог, пришлось бы брать из этой библиотеки еще и RTTI, и заботиться о том, какой она версии и так далее. Ты до сих пор не понимаешь, о чем идет речь. Если я не меняю платформы и языка разработки, то обо всех этих тонкостях я не должен заботиться. Это не моя головная боль. Все это - головная боль языка и библиотеки его поддержки. Все остальное - от лукавого. Вот если мне надо будет экспортировать интерфейсы за пределы языковой платформы - только в этом случае я должен буду об этом позаботиться. В рамках выбранной технологии экспорта. А сейчас все выглядит так, что сначала по-быстрому прикрутили фенечку (с интерфейсами и поддержкой COM), а потом позно было что-то менять. ![]() Цитата --Ins-- @ Я критикую C++ лишь за то, что основной принцип этого языка - вседозволенность, которая на мой взгляд не нужна ВЫСОКОУРОВНЕВОМУ ЯП, тем более - объектному. И как следствие - отсутствие всякой логики, наличие неоднозначностей и противоречий. На мой взгляд - это один из худших языков, реализующий концепцию императивного программирования. Причина этому возможно субъективна. Паскалевское воспитание, которое приучает к дисциплине в программировании. Вседозволенности в С++ не больше, чем в Delphi. На самом деле, для того, чтобы начать грамотно программировать на С++ достаточно прочитать две книжки: букварь, описывающий основные возможности языка, и книгу Дж. Элджера "Язык С++", в которой описываются основные проблемные места, и методики их обхода, о которых должен помнить разработчик. Все! ![]() |
Сообщ.
#1671
,
|
|
|
Цитата ISC @ Ответ новичка не знающего Делфи: char* pCh = "test"; pCh++; Кстати, что означает эта конструкция в С++? Меня всегда интересовало, утечки памяти не будет? |
Сообщ.
#1672
,
|
|
|
Цитата Romkin @ Можно в С++ взять готовую двоичную реализацию интерфейса и использовать в своем классе? Delphi - может. Что есть "готовая двоичная реализация интерфейса"? Добавлено Цитата Romkin @ Один вопрос: QString - потомок std::basic_string? Нет. Но может быть легко преобразован в него и обратно. |
Сообщ.
#1673
,
|
|
|
Цитата --Ins-- @ А если бы он присваивался автоматом только в том случае, если я его не назначил сам? А вот это вопрос на засыпку ![]() |
Сообщ.
#1674
,
|
|
|
Цитата Romkin @ Кстати, что означает эта конструкция в С++? Меня всегда интересовало, утечки памяти не будет? Нет. Ты присваиваешь указателю на char адрес, по которому расположен строковый литерал. |
Сообщ.
#1675
,
|
|
|
Цитата Romkin @ Кстати, что означает эта конструкция в С++? Меня всегда интересовало, утечки памяти не будет? Инкримент указателя на ячейку памяти. В смысле утечки? Когда выделенная память станет не нужна? Если память освободить, утечки не будет |
Сообщ.
#1676
,
|
|
|
Цитата в которой описываются основные проблемные места, и методики их обхода А зачем делать в языке фичи, использование которых приведет в конечном итоге только к проблемам? Какой в этом смысл? Чтобы потом читать про то, что их не нужно использовать и в конечном итоге - не использовать? Цитата только языки и среды, которые бьют по рукам в любом подходящем для этого месте. Не мне вам объяснять, что контроль ошибок в compile-time (в т.ч. логических) - всегда благо, по сравнению с отсутствием контроля или контролем в run-time ![]() ![]() |
Сообщ.
#1677
,
|
|
|
Цитата Flex Ferrum @ Что есть "готовая двоичная реализация интерфейса"? Композиция готового двоичного кода. Не так давно стояла задача: есть библиотека с уже написанной реализацией интерфейса (например, IFoo), а тут потребовалось сделать коллекцию этих интерфейсов. Причем требовалось сделать именно враппер, расширить имеющийся интерфейс. Я просто сделал класс, реализующий интерфейс элемента коллекции плюс нужный интерфейс IFoo. И в качестве реализации IFoo взял имеющуюся. По правде сказать, там я создаю класс явно, но вполне могу получать интерфейс и из другой библиотеки, меняется одна строка создания имплементации. Думаю, я все-таки разделю библиотеки в будущем. Добавлено Цитата ISC @ Когда выделенная память станет не нужна? Если память освободить, утечки не будет Просто указатель-то сместился. Как опознается, сколько надо освободить? Добавлено Цитата Flex Ferrum @ Один вопрос: QString - потомок std::basic_string? Нет. Но может быть легко преобразован в него и обратно. А почему? Если basic_string - это базис, то почему не потомок?! |
Сообщ.
#1678
,
|
|
|
Цитата Когда присваивался? Честное слово, мне - по барабану. Это не мои заботы, а разработчиков компилятора. Пусть хотя бы при первом билде и далее существовал всегда. Меня бы даже устроило, если бы интерфейсы без IID-ов различались по именам ![]() Добавлено Цитата char* pCh = "test"; pCh++; ![]() ![]() var pCh: PChar; begin pCh := 'test'; Inc(pCh); |
Сообщ.
#1679
,
|
|
|
Цитата --Ins-- @ Честное слово, мне - по барабану. Это не мои заботы, а разработчиков компилятора. Пусть хотя бы при первом билде и далее существовал всегда. Меня бы даже устроило, если бы интерфейсы без IID-ов различались по именам А если при первом билде - то где хранить? В отдельном файлике? А удобнее ли это, чем в тексте программы? |
Сообщ.
#1680
,
|
|
|
Цитата Romkin @ Просто указатель-то сместился. Как опознается, сколько надо освободить? Ну в том случае память выделяется возможностями компилятора, он и будет заботится о правильном её освобождении. А если выделять память самостоятельно, то нужно и позаботиться о правильном её освобождении |