Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > вызов метода обьекта в списке


Автор: lebaon 29.7.2007, 14:15
такая ситуация: есть несколько классов
Код

gameobject = class
    procedure show;virtual;abstract; 
    constructor create;
    destructor destroy;

end;
pgameobject = ^gameobject;

GO_2d = class (gameobject)
    procedure show;override;
    constructor create;
    destructor destroy;
end;

init_object = class (gameobject)
    procedure show;
    constructor create;


end;


есть список с обьектами классов init_object и GO_2d под названием mainlist
когда я делаю так:

Код

ic:=0;
    if ic<>mainlist.Count then
    begin
    repeat
    po:=mainlist.Items[ic];
    po^.show;
    glPopMatrix;{восстанавливает матрицу взгляда игрока}
    ic:=ic+1;
    until ic=mainlist.Count;


на строке po^.show; вылетает, хотя по идее должна вызывать GO_2d.show или init_object.show,
вопрос, в чем я ошибся?  smile 

Автор: Yanis 29.7.2007, 14:33
Не в обиду будет сказано.
Я всегда был в шоке над программерами игр. 
Точнее над стилем кодирования smile
А с какой ошибкой вылетает?

Автор: bems 29.7.2007, 14:37
1) не надо указателей на классы ибо итак все уже сделано за тебя
2) покажи как заполняешь список

Автор: MetalFan 29.7.2007, 15:07
а override на show в init_object? + замечание про указатель... не нужен он.

Автор: lebaon 29.7.2007, 15:29
заполняю список так
Код

constructor gameobject.create;
begin
inherited create;
mainlist.Add(@self);


end;



destructor gameobject.destroy;
begin
mainlist.Remove(@self);
end;


пробовал и без указателя, вот так
Код

ic:=0;
    if ic<>mainlist.Count then
    begin
    repeat
   gameobject(mainlist.Items[ic])^.show;
    glPopMatrix;{восстанавливает матрицу взгляда игрока}
    ic:=ic+1;
    until ic=mainlist.Count;

результат такой же, улетает куда то в ffffffff   smile 
а что овверайд? его не нужно? а то я запутался  smile 

Автор: MetalFan 29.7.2007, 17:23
Цитата(lebaon @  29.7.2007,  15:29 Найти цитируемый пост)
пробовал и без указателя, вот так

как без указателя? а что тогда там шляпа делает опять???

Автор: bems 29.7.2007, 18:44
убираешь собак:
Код

constructor gameobject.create;
begin
inherited create;
mainlist.Add(self);


end;



destructor gameobject.destroy;
begin
mainlist.Remove(self);
end;


убираешь шляпы:
Код

ic:=0;
    if ic<>mainlist.Count then
    begin
    repeat
   gameobject(mainlist.Items[ic]).show;
    glPopMatrix;{восстанавливает матрицу взгляда игрока}
    ic:=ic+1;
    until ic=mainlist.Count;


потом
Цитата(MetalFan @  29.7.2007,  15:07 Найти цитируемый пост)
а override на show в init_object?


если список - потомок TObjectList то будет работать
если нет - то при добавлении и удалении нужно привести объект к указателю 
Код

pointer(self)


Автор: MetalFan 29.7.2007, 20:55
Цитата(bems @  29.7.2007,  18:44 Найти цитируемый пост)
потом
Цитата(MetalFan @  29.7.2007,  15:07 Найти цитируемый пост)
а override на show в init_object?


если список - потомок TObjectList то будет работать
если нет - то при добавлении и удалении нужно привести объект к указателю 

эмм... я немного про другое... там не перекрыт метод show. при приведении к базовому классу, в случае, если это объект класса init_object словим Abstract Error

Автор: bems 29.7.2007, 21:06
Цитата(MetalFan @  29.7.2007,  20:55 Найти цитируемый пост)
 я немного про другое
ты не про другое. Это я в порядке перечисления  

Автор: MetalFan 29.7.2007, 21:16
bems, а, сорь) я нипонял)

Автор: lebaon 30.7.2007, 12:39
Цитата

эмм... я немного про другое... там не перекрыт метод show. при приведении к базовому классу, в случае, если это объект класса init_object словим Abstract Error

 и как я не заметил?  smile  исправил, спасибо!
bems
про собак и шляпы не очень понял
а вот смена списка на TObjectList помогла, спасибо! smile 

Автор: bems 30.7.2007, 14:05
Цитата(lebaon @  30.7.2007,  12:39 Найти цитируемый пост)
про собак и шляпы не очень понял
все просто. если ты хочешь получить указатель на объект то просто приводишь переменную типа класс к указателю (потому что физически это и есть указатель).
@self - указатель на указатель на объект
pointer(self) - указатель на объект
но с TObjectList указатели вообще не нужны

Добавлено через 1 минуту и 29 секунд
ну и там где у тебя была шляпа (^) она тоже не нужна, а нужно простое приведение gameobject(mainlist.Items[ic])

Автор: lebaon 30.7.2007, 20:57
Цитата

все просто. если ты хочешь получить указатель на объект то просто приводишь переменную типа класс к указателю (потому что физически это и есть указатель).
@self - указатель на указатель на объект

вот где собака порылась...я и не знал про это smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)