IPB
ЛогинПароль:

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

3 страниц V < 1 2 3  
 Ответить  Открыть новую тему 
> ООП во FP, робота с обьектами
сообщение
Сообщение #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 байт ) Кол-во скачиваний: 190
Прикрепленный файл  test.PAS ( 207 байт ) Кол-во скачиваний: 193


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #42


Гость






Цитата
почему?
Потому, что у тебя программа не знает о переопределении в модуле оператора присваивания, ей надо об этом сообщить... Добавь в модуле перед Implementation описания:

operator := (const d: dir): T;
operator := (const s: string): T;

, и все будет компилироваться.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #43


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


спасибо!

А можна где нибудь посмотреть пример вызова метода другого обьекта(который описан в другом модуле) из метода другого обьекта(который также реализован в отдельном модуле)?

заранее благодарен.

Добавлено через 3 мин.
у меня возникает Class isn’t a parent class of the current class


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #44


Гость






Можно посмотреть пример, как ты это делаешь?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #45


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 8.07.2007 20:27) *
Можно посмотреть пример, как ты это делаешь?
{$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.





--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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;

 К началу страницы 
+ Ответить 
сообщение
Сообщение #47


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


м-да...
Цитата(volvo @ 8.07.2007 21:19) *
Ты пытаешься вызвать процедуру через тип объекта, а для этого надо static метод...
тоесть если я сделаю все static оно может заработает но не на FPC smile.gif
Цитата(volvo @ 8.07.2007 21:19) *
В FPC нереализуемо, если у тебя o1 является Object-ом, а не Class-ом...
ух єти классы.. где про них можна прочитать(руководство смотрел только больше запутался и вообще потерял способность различать обьекты и классы оф. сайт FP, моя тема...)
Цитата(volvo @ 8.07.2007 21:19) *
Ну, а на самом деле я думаю, что тебе надо бы объявить экземпляр объекта типа o1, и вызывать для него метод P:
в том же и дело что это только модули подключаемые к программе...

ЗЫ попробую через классы...
ЗЗЫ хотелось бы услышать твое обьяснение о различии обьектов и классов...



--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #48


Гость






Цитата
хотелось бы услышать твое обьяснение о различии обьектов и классов...
Того, что есть в документации (prog.pdf, chapters 8.2.12/8.2.13) недостаточно?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #49


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 9.07.2007 12:50) *
Того, что есть в документации (prog.pdf, chapters 8.2.12/8.2.13) недостаточно?
Class ... just like objects...smile.gif

Сообщение отредактировано: compiler -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #51


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 9.07.2007 13:28) *
4) Уровень доступа published
а можна тут по подробней, а то я не могу понять...
Цитата(volvo @ 9.07.2007 13:28) *
+ еще одно отличие: operators overloading прекрасно работает с Object-ами, но с Class-сами происходят очень непонятные вещи...
спасибо за предупреждение
Цитата(volvo @ 9.07.2007 13:28) *
Что ты думаешь будет делаться в этом фрагменте:
  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 -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #52


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


где можна посмотреть конструктор для class-а, с инициализацией и вызовом в главной прогграмме?

Сообщение отредактировано: compiler -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #53


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


и деструктор(имея указатель на уничтожаемый обьект)

добавлено
помогите!

Сообщение отредактировано: compiler -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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.

 К началу страницы 
+ Ответить 
сообщение
Сообщение #55


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


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


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 К началу страницы 
+ Ответить 

3 страниц V < 1 2 3
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.09.2020 1:12
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name