![]() |
![]() |
compiler |
![]() ![]()
Сообщение
#1
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
вот какой вопрос возник(словами не получается попробую на примере)
дано 3 объекта(одного типа M с двумя полями- днем и месецем.) необходимо прочитать данные для первых 2-х объектов(это я сам сделаю) и ввести разницу дат в 3-ий объект(как). примечание первый и второй объект являются родительскими для третьего. Помогите.. Собственно у меня все получается кроме обработки данных интересно было бы увидеть реализацию и на TP. Сообщение отредактировано: compiler - 22.04.2007 16:36 -------------------- Спасибо!
Удачи! |
![]() ![]() |
compiler |
![]() ![]()
Сообщение
#41
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
тут я разобрался, но у меня возникают проблемы при размещении обьекта в модуле
берем программу 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" заранее благодарен. Прикрепленные файлы ![]() ![]() -------------------- Спасибо!
Удачи! |
volvo |
![]()
Сообщение
#42
|
Гость ![]() |
Цитата почему? Потому, что у тебя программа не знает о переопределении в модуле оператора присваивания, ей надо об этом сообщить... Добавь в модуле перед Implementation описания:operator := (const d: dir): T;
operator := (const s: string): T;
, и все будет компилироваться. |
compiler |
![]()
Сообщение
#43
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
спасибо!
А можна где нибудь посмотреть пример вызова метода другого обьекта(который описан в другом модуле) из метода другого обьекта(который также реализован в отдельном модуле)? заранее благодарен. Добавлено через 3 мин. у меня возникает Class isn’t a parent class of the current class -------------------- Спасибо!
Удачи! |
volvo |
![]()
Сообщение
#44
|
Гость ![]() |
Можно посмотреть пример, как ты это делаешь?
|
compiler |
![]()
Сообщение
#45
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
Можно посмотреть пример, как ты это делаешь?
{$mode objfpc}
unit e1;
interface
type
o1 = object
procedure p();
end;
implementation
procedure o1.p();
begin end;
end.
и
{$mode objfpc}
unit e2;
interface
type
o2 = object
constructor create;
procedure pr();
end;
implementation
uses e1;
procedure o2.pr();
begin o1.p();end;
end.
-------------------- Спасибо!
Удачи! |
volvo |
![]()
Сообщение
#46
|
Гость ![]() |
Ты пытаешься вызвать процедуру через тип объекта, а для этого надо static метод... В FPC нереализуемо, если у тебя o1 является Object-ом, а не Class-ом... С Class-ом будет так:
{$mode objfpc}
unit e1;
interface
type
o1 = class
class procedure p();
end;
implementation
procedure o1.p();
begin end;
end.
, тогда
procedure o2.pr();
begin
o1.p(); // здесь - Ok
end;
Ну, а на самом деле я думаю, что тебе надо бы объявить экземпляр объекта типа o1, и вызывать для него метод P: var
ex1: o1;
procedure o2.pr();
begin
ex1.p();
end;
|
compiler |
![]()
Сообщение
#47
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
м-да...
Ты пытаешься вызвать процедуру через тип объекта, а для этого надо static метод... тоесть если я сделаю все static оно может заработает но не на FPC ![]() В FPC нереализуемо, если у тебя o1 является Object-ом, а не Class-ом... ух єти классы.. где про них можна прочитать(руководство смотрел только больше запутался и вообще потерял способность различать обьекты и классы оф. сайт FP, моя тема...)Ну, а на самом деле я думаю, что тебе надо бы объявить экземпляр объекта типа o1, и вызывать для него метод P: в том же и дело что это только модули подключаемые к программе... ЗЫ попробую через классы... ЗЗЫ хотелось бы услышать твое обьяснение о различии обьектов и классов... -------------------- Спасибо!
Удачи! |
volvo |
![]()
Сообщение
#48
|
Гость ![]() |
Цитата хотелось бы услышать твое обьяснение о различии обьектов и классов... Того, что есть в документации (prog.pdf, chapters 8.2.12/8.2.13) недостаточно? |
compiler |
![]()
Сообщение
#49
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
Того, что есть в документации (prog.pdf, chapters 8.2.12/8.2.13) недостаточно? Class ... just like objects...![]() Сообщение отредактировано: compiler - 9.07.2007 13:04 -------------------- Спасибо!
Удачи! |
volvo |
![]()
Сообщение
#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 |
![]()
Сообщение
#51
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
4) Уровень доступа published а можна тут по подробней, а то я не могу понять...+ еще одно отличие: operators overloading прекрасно работает с Object-ами, но с Class-сами происходят очень непонятные вещи... спасибо за предупреждениеЧто ты думаешь будет делаться в этом фрагменте: если мы его немног видоизменим, то ничего страшного... o1.p();
? {$mode objfpc}
{$STATIC ON}
unit e1;
interface
type
o1 = class
i:integer; static;//кто придумал задавать параметр через разделитель?
class procedure p();
end;
implementation
procedure o1.p();
begin
inc(self.i);
end;
end.
Сообщение отредактировано: compiler - 9.07.2007 13:49 -------------------- Спасибо!
Удачи! |
compiler |
![]()
Сообщение
#52
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
где можна посмотреть конструктор для class-а, с инициализацией и вызовом в главной прогграмме?
Сообщение отредактировано: compiler - 13.07.2007 13:02 -------------------- Спасибо!
Удачи! |
compiler |
![]()
Сообщение
#53
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
и деструктор(имея указатель на уничтожаемый обьект)
добавлено помогите! Сообщение отредактировано: compiler - 13.07.2007 14:20 -------------------- Спасибо!
Удачи! |
volvo |
![]()
Сообщение
#54
|
Гость ![]() |
Модуль:
unit _u;
interface
type
T = object
private
_value: integer;
public
property value: integer read _value write _value;
constructor create(x: integer = 10);
destructor destroy();
end;
implementation
constructor T.create(x: integer);
begin
value := x;
//
end;
destructor T.destroy();
begin
//
end;
end.
Программа: uses _u;
var
my_obj: ^T;
begin
new(my_obj, create(17)); // инициализация
writeln(my_obj^.value); // вызов
dispose(my_obj, destroy()) // удаление
end.
|
compiler |
![]()
Сообщение
#55
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
volvo, спасибо большое, твоя программка заставила меня порыться в руководстве, узнать много нового, но не мог бы ты написать тоже для class-а...
-------------------- Спасибо!
Удачи! |
volvo |
![]()
Сообщение
#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;
var
my_obj: T;
begin
my_obj := T.create(17);
writeln(my_obj.value);
my_obj.destroy();
end.
Сообщение отредактировано: volvo - 14.07.2007 16:40 |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 21:33 |