Помощь - Поиск - Пользователи - Календарь
Полная версия: Как правильно писать программы 2
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Bokul
Ничего еще не сделал, но зато уже успел запутаться. Вот пытался реализовать инициализацию sos - создания списка и инициализацию предка - добавить себя в этот список, но ничего не получается.
uses crt;
type
ancestor=Object
pos_x,pos_y:integer;
constructor init;
end;

TList = ^TNode;
TNode = record
Info:ancestor;
Next:TList;
end;

sos=Object
ActiveObject:^ancestor;
Objects:TList;
constructor init;
end;

constructor ancestor.init;
var nod,P: TList;
begin
pos_x:=10;
pos_y:=10;
new(nod);
nod^.Info:=ancestor;// не знаю, что присваивать тут.
nod^.Next :=nil;
if sos.Objects=nil then // Что за ошибка Error: Class isn't a parent class of the current class
sos.Objects:=nod
else
begin
P:=sos.Objects;
while nod^.Next <> nil
do P:=P^.Next;
P^.Next:=nod
end;
End;

constructor sos.init;
begin
Objects:= nil
end;
volvo
Altair, ау!!! Ты где? И после этого ты тоже скажешь, что class-member-ы не нужны? smile.gif

По теме: Bokul, ты не можешь обращаться к полю/методу класса, нужно создать экземпляр этого класса, и его поле проверять на что-то... Или... Class Functions - см. здесь: Fpc, методы класса
Bokul
volvo, это к какой ошибке относится? К этой Что за ошибка Error: Class isn't a parent class of the current class
? Если да, то Objects это же поле, Class Functions не поможет... unsure.gif
volvo
Цитата
Objects это же поле, Class Functions не поможет
Это смотря как его попросить smile.gif

Но на самом деле я бы не советовал использовать Class Members налево и направо... Чревато ошибками и нарушением структуры программы... Лучше сделать так:

uses crt;
type
pancestor = ^ancestor;
ancestor = Object
pos_x, pos_y: integer;
constructor init(px, py: integer);
end;

TList = ^TNode;
TNode = record
Info: pancestor;
Next: TList;
end;

sos = Object

ActiveObject: pancestor;
Objects: TList;
constructor init;

procedure InsertObject(const p: pancestor);

private
LastObject: TList;
end;

constructor ancestor.init(px, py: integer);
var nod,P: TList;
begin
pos_x := px; pos_y := py;
end;

procedure sos.InsertObject(const p: pancestor);
var adding: TList;
begin
new(adding);
with adding^ do begin
Info := p;
next := nil;
end;

if Objects = nil then Objects := adding
else LastObject^.next := adding;
LastObject := adding;
end;

constructor sos.init;
begin
Objects:= nil; LastObject := nil;
end;

var
sosObj: sos;
begin
sosObj.init;
sosObj.InsertObject(new(pancestor, init(10, 10)));
// ...
end.
Кстати, сделав TList тоже объектом, ты много выиграешь...
Bokul
Спасибо, все понятно rolleyes.gif Только компилятор ругается на
procedure sos.InsertObject(const p: pancestor);
-----------------------------------------
new(adding);// type identifier expected
-----------------------------------------
end;

Что ему не нравится?
volvo
Не знаю... Я копировал из откомпиленного исходника, у меня не ругался...

Попробуй вторую форму записи:
adding := new(tlist);
Bokul
Цитата
Не знаю... Я копировал из откомпиленного исходника, у меня не ругался...

Единственная ошибка, наверное я не умею правильно использовать Ctrl+C, а может что-то другое... Сейчас посмотрю.
Цитата
все понятно

Эт я обманул... no1.gif
Что за фишка?
procedure InsertObject(const p: pancestor);
-----------------------------------------------
sosObj.InsertObject(new(pancestor, init(10, 10) ));


Про const я помню, ты еще давно объяснял - чтобы не изменить нечайно, но new(pancestor, init(10, 10)) не сильно понятно или это как Faq'е B:=New(_B.INIT); ( http://forum.pascal.net.ru/index.php?showtopic=2085 )
volvo
А это - расширенная форма записи... Дело все в том, что для запроса памяти, необходимой под, скажем, запись (Record), достаточно сделать new(p), где p - указатель на тип записи... А если я хочу сделать динамический объект? Ведь объекты нужно инициализировать конструктором, правильно? Иначе, при неинициализированном объекте, попытка вызвать, например, виртуальный метод, приведет к зависанию программы. (Это тоже написано в FAQ-е, я просто напоминаю smile.gif ) Поэтому специально для объектов ввели второй параметр - для инициализации определенным конструктором (естественно, с его параметрами)...
Bokul
Цитата
А это - расширенная форма записи... Дело все в том, что для запроса памяти, необходимой под, скажем, запись (Record), достаточно сделать new(p), где p - указатель на тип записи... А если я хочу сделать динамический объект? Ведь объекты нужно инициализировать конструктором, правильно? Иначе, при неинициализированном объекте, попытка вызвать, например, виртуальный метод, приведет к зависанию программы. (Это тоже написано в FAQ-е, я просто напоминаю ) Поэтому специально для объектов ввели второй параметр - для инициализации определенным конструктором (естественно, с его параметрами)...

Вот так полностью понятно yes2.gif СПАСИБО!!!
Цитата
Попробуй вторую форму записи:
adding := new(tlist);

Заработало!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.