ООП во FP, робота с обьектами |
ООП во FP, робота с обьектами |
compiler |
8.07.2007 17:28
Сообщение
#41
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
тут я разобрался, но у меня возникают проблемы при размещении обьекта в модуле
берем программу volvo приабразовываем в модуль(прикрепленный файл) и аналогичном тесте получаю Error: Код test.PAS(6,8) Error: Incompatible types: got "ShortString" expected "T" почему?test.PAS(9,8) Error: Incompatible types: got "ShortString" expected "T" test.PAS(12,8) Error: Incompatible types: got "dir" expected "T" заранее благодарен. Прикрепленные файлы modul.pas ( 810 байт ) Кол-во скачиваний: 264 test.PAS ( 207 байт ) Кол-во скачиваний: 258 -------------------- Спасибо!
Удачи! |
volvo |
8.07.2007 18:51
Сообщение
#42
|
Гость |
Цитата почему? Потому, что у тебя программа не знает о переопределении в модуле оператора присваивания, ей надо об этом сообщить... Добавь в модуле перед Implementation описания:operator := (const d: dir): T;, и все будет компилироваться. |
compiler |
8.07.2007 19:47
Сообщение
#43
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
спасибо!
А можна где нибудь посмотреть пример вызова метода другого обьекта(который описан в другом модуле) из метода другого обьекта(который также реализован в отдельном модуле)? заранее благодарен. Добавлено через 3 мин. у меня возникает Class isn’t a parent class of the current class -------------------- Спасибо!
Удачи! |
volvo |
8.07.2007 20:27
Сообщение
#44
|
Гость |
Можно посмотреть пример, как ты это делаешь?
|
compiler |
8.07.2007 20:38
Сообщение
#45
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Можно посмотреть пример, как ты это делаешь?
{$mode objfpc}и {$mode objfpc} -------------------- Спасибо!
Удачи! |
volvo |
8.07.2007 21:19
Сообщение
#46
|
Гость |
Ты пытаешься вызвать процедуру через тип объекта, а для этого надо static метод... В FPC нереализуемо, если у тебя o1 является Object-ом, а не Class-ом... С Class-ом будет так:
{$mode objfpc} , тогда
Ну, а на самом деле я думаю, что тебе надо бы объявить экземпляр объекта типа o1, и вызывать для него метод P: var |
compiler |
9.07.2007 12:42
Сообщение
#47
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
м-да...
Ты пытаешься вызвать процедуру через тип объекта, а для этого надо static метод... тоесть если я сделаю все static оно может заработает но не на FPC В FPC нереализуемо, если у тебя o1 является Object-ом, а не Class-ом... ух єти классы.. где про них можна прочитать(руководство смотрел только больше запутался и вообще потерял способность различать обьекты и классы оф. сайт FP, моя тема...)Ну, а на самом деле я думаю, что тебе надо бы объявить экземпляр объекта типа o1, и вызывать для него метод P: в том же и дело что это только модули подключаемые к программе... ЗЫ попробую через классы... ЗЗЫ хотелось бы услышать твое обьяснение о различии обьектов и классов... -------------------- Спасибо!
Удачи! |
volvo |
9.07.2007 12:50
Сообщение
#48
|
Гость |
Цитата хотелось бы услышать твое обьяснение о различии обьектов и классов... Того, что есть в документации (prog.pdf, chapters 8.2.12/8.2.13) недостаточно? |
compiler |
9.07.2007 13:03
Сообщение
#49
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Того, что есть в документации (prog.pdf, chapters 8.2.12/8.2.13) недостаточно? Class ... just like objects...Сообщение отредактировано: compiler - 9.07.2007 13:04 -------------------- Спасибо!
Удачи! |
volvo |
9.07.2007 13:28
Сообщение
#50
|
Гость |
Ну, отличий тоже хватает:
1) (там же - 8.2.13) Цитата Contrary to objects, all data fields of a class are always stored in heap memory. Дальше - из ref.pdf: 2) Цитата 6.3.2 Virtual methods Classes have virtual methods, just as objects do. There is however a difference between the two. For objects, it is sufficient to redeclare the same method in a descendent object with the keyword virtual to override it. For classes, the situation is different: virtual methods must be overridden with the override keyword. Failing to do so, will start a new batch of virtual methods, hiding the previous one. 3) Добавлены message methods для классов ... 4) Уровень доступа published + еще одно отличие: operators overloading прекрасно работает с Object-ами, но с Class-сами происходят очень непонятные вещи... Цитата(compiler) в том же и дело что это только модули подключаемые к программе... Ну и что, что только модули? Если модуль, так можно бессмысленно писать что-то? Что ты думаешь будет делаться в этом фрагменте:o1.p();? Особенно, если ни один экземпляр класса (или объекта) еще не инстанцирован? Сообщение отредактировано: volvo - 9.07.2007 13:30 |
compiler |
9.07.2007 13:48
Сообщение
#51
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
4) Уровень доступа published а можна тут по подробней, а то я не могу понять...+ еще одно отличие: operators overloading прекрасно работает с Object-ами, но с Class-сами происходят очень непонятные вещи... спасибо за предупреждениеЧто ты думаешь будет делаться в этом фрагменте: если мы его немног видоизменим, то ничего страшного...o1.p();? {$mode objfpc} Сообщение отредактировано: compiler - 9.07.2007 13:49 -------------------- Спасибо!
Удачи! |
compiler |
13.07.2007 12:57
Сообщение
#52
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
где можна посмотреть конструктор для class-а, с инициализацией и вызовом в главной прогграмме?
Сообщение отредактировано: compiler - 13.07.2007 13:02 -------------------- Спасибо!
Удачи! |
compiler |
13.07.2007 13:39
Сообщение
#53
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
и деструктор(имея указатель на уничтожаемый обьект)
добавлено помогите! Сообщение отредактировано: compiler - 13.07.2007 14:20 -------------------- Спасибо!
Удачи! |
volvo |
13.07.2007 15:51
Сообщение
#54
|
Гость |
Модуль:
unit _u; Программа: uses _u; |
compiler |
14.07.2007 15:35
Сообщение
#55
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
volvo, спасибо большое, твоя программка заставила меня порыться в руководстве, узнать много нового, но не мог бы ты написать тоже для class-а...
-------------------- Спасибо!
Удачи! |
volvo |
14.07.2007 16:39
Сообщение
#56
|
Гость |
Цитата(ref.pdf) 6.2. Class instantiation Remember that a class is a pointer to an object, so when a variable of some class is declared, the compiler just allocates a pointer, not the entire object. Следовательно, в модуле меняешь в определении типа T слово Object на Class, а программу переписываешь так: uses _u; Сообщение отредактировано: volvo - 14.07.2007 16:40 |
Текстовая версия | 23.09.2024 4:03 |