
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.30] |
![]() |
|
Страницы: (245) « Первая ... 240 241 [242] 243 244 ... Последняя » ( Перейти к последнему сообщению ) |
Сообщ.
#3616
,
|
|
|
Shaggy, еще раз. Основная проблема, которую я тут вижу, заключается в том, что ссылка с подсчетом ссылок и без зависит от места в иерархии. Это маразм. Я хочу общаться со своим объектом в одном месте как с объектом одного класса/интерфейса, а в другом - как другого. И это нормально для ООП кода. При чем тут вообще посчет ссылок?
При этом в С++: T * - невладеющий указатель unique_ptr<T> - уникально владеющий указатель(т.е. является единственным правомерным владельцем) shared_ptr<T> - множественное владение(подсчет ссылок) weak_ptr<T> - не владеет объектом, но позволяет получить shared_ptr(нулевой, если объекта уже нет) Вне какой-либо зависимости от иерархий, "вида" типа(класс или примитив) и пр. |
![]() |
Сообщ.
#3617
,
|
|
D_KEY, korvin, я не понял, мы с кем разговариваем?
Цитата Qraizer @ Не надо считать? Ну ладно, а зачем тогда было вводить счётчики? Ах, всё-таки надо... тогда почему такую простейшую задачу надо выполнять руками? На кой хрен сдался этот интерфейс, который не умеет того, для чего создавался - избавить программера от рутины?Никто не владеет, некому и считать ссылки. Отсюда в частности и обсуждаемые проблемы. Не, это явно бред сивой Абракадеро, выдуманный специально по такому случаю взятым в аренду у MS-а системным архитектором-профессионалом по эффекту Балмера. |
![]() |
Сообщ.
#3618
,
|
|
Цитата Qraizer @ Не ну Дельфи-то понять можно, korvin. Унаследовав COM к себе и приняв его вынужденные ограничения, Дельфи с COM-интерфейсами иначе никак и не поступить. Интересно, как эти их интерфейсы теперь уживаются с Objective-C фрейворками например, где ARC считает объекты, а не интерфейсы. Добавлено Которые мне придется переопределять, как в твоем TNoRefObject. Цитата Shaggy @ а вообще, хранить и использовать две ссылки(с подсчётом ссылок и сырую) на одну сущьность, это нормально? C++way? Ну Делфи-то это позволяет: ![]() ![]() var NoCount: TInterfacedObject; NoCount := TInterfacedObject.Create; procedure Foo(Countable: IInterface); procedure Bar(NoCount: TInterfacedObject); Foo(NoCount); Bar(NoCount); и даже никаких варнингов или хинтов, только Access Violation. =) Это не интерфейс. ![]() ![]() TInterfaceA = class(TObject) ... // abstract methods end; TInterfaceB = class(TObject) ... // abstract methods end; TMyClass = class(TObject, TInterfaceA, TInterfaceB) // Oops! У делфистов какое-то альтернативное понятие пустоты: ![]() Что "и?" Либо считайте ссылки объекта, либо не уничтожайте объект при значении счетчика == 0. Отсутствие интерфейсных ссылок на объект не означает отсутствия "классовых" ссылок на объект. |
Сообщ.
#3619
,
|
|
|
Цитата Shaggy @ function TNoRefObject._AddRef: Integer; begin Result := MAXINT; end; function TNoRefObject._Release: Integer; begin Result := MAXINT; end; Эти две реализации должны подставляться автоматически компилятором, а не программистом. А пока оно так , как оно есть в Delphi, люди будут пользовать Java/C# где таких граблей нет. |
Сообщ.
#3620
,
|
|
|
Ну в java/c# вообще сборщик мусора. Правильно сравнивать с C++, objective-c и др. языками с ручным управлением памятью и подсчётом ссылок.
|
Сообщ.
#3621
,
|
|
|
D_KEY, тут скорее всего сравнение в логике поведения ключевого слова interface. В Java и ссылки через-интерфейс и через класс приводят к одинаковым последствиям:
![]() ![]() SomeClass someObject = new SomeClass(); InterfaceThatIsImplmentedBySomeClass someInterfacedObject = someObject; // Количество ссылок на someObject = 2 В Delphi подсчет ссылок ведется только для интерфейсов: ![]() ![]() var someObject: SomeClass; someInterfacedObject: InterfaceThatIsImplmentedBySomeClass; begin someObject := TInterfacedObject.Create; someInterfacedObject := someObject; { Количество ссылок на someObject = 1 } Такая вот петрушка. |
![]() |
Сообщ.
#3622
,
|
|
Цитата D_KEY @ Правильно сравнивать с C++, objective-c и др. языками с ручным управлением памятью и подсчётом ссылок. Rust? |
Сообщ.
#3623
,
|
|
|
Цитата korvin @ Цитата D_KEY @ Правильно сравнивать с C++, objective-c и др. языками с ручным управлением памятью и подсчётом ссылок. Rust? Ну там как и в плюсах отдельные типы ссылок. |
![]() |
Сообщ.
#3624
,
|
|
Цитата korvin @ Не знаю. Там, видимо, один в один архитектуру COM не проксили. Интересно, как эти их интерфейсы теперь уживаются с Objective-C фрейворками например, где ARC считает объекты, а не интерфейсы. Добавлено korvin, а что такое ARC? |
Сообщ.
#3625
,
|
|
|
![]() |
Сообщ.
#3626
,
|
|
Хм, а это случаем не то, что добавили в C++11 как поддержку сборщиков? Надо полистать, что там писали, а то в Стандарте эти GC упомянуты очень скупо.
|
Сообщ.
#3627
,
|
|
|
Цитата Qraizer @ Хм, а это случаем не то, что добавили в C++11 как поддержку сборщиков? Надо полистать, что там писали, а то в Стандарте эти GC упомянуты очень скупо. Нет, не то. И там нечего описывать - просто функции для подсказок возможному GC. |
![]() |
Сообщ.
#3628
,
|
|
Ну вот их-то я и видел. Т.е. никакой другой инфы не предлагалось до 11-го года?
|
Сообщ.
#3629
,
|
|
|
Цитата Qraizer @ Ну вот их-то я и видел. Т.е. никакой другой инфы не предлагалось до 11-го года? Ну, вроде видел предложения опционального GC от Hewlett Packard, но какие-то странные... А то, что сейчас в Стандарте, не понятно как юзать, т.к. ни одной реализации с GC нет. |
Сообщ.
#3630
,
|
|
|
Да будет ли большой толк от GC в C++? Деструкторы-то никуда не денутся. Разве что для некоторых алгоритмов удобнее будет.
|