|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Как мне передать указатель?
Подскажите как сделать чтобы наследуемый метод add добавлял элемент в конец именно массива внутри класса, который его вызывает?
Код:
unit test; interface type a = class( tobject ) public procedure add( i : integer; xy: pointer); end; b = class( a ) public x : array of integer; end; c = class( a ) public y : array of integer; end; implementation procedure a.add( i : integer; xy: pointer); begin setlength( @xy, length( @xy ) + 1 ); //ругается на xy self.xy[ length( self.xy ) - 1 ] := i; end; var my_b: b; my_c: c; begin my_b := b.create; my_c := c.create; my_b.add(123, @my_b.x); //Нужно добавить 123 в массив x my_c.add(456, @my_b.y); //Нужно добавить 456 в массив y end. Последний раз редактировалось kenshi245, 19.06.2017 в 19:49. |
#2
|
|||
|
|||
ну тут надо по другому - либо в родителе метод абстрактрый и реализован в потомках, либо шаблоны/дженерики.
Вариант первый - классическое ООП: Код:
type A = class procedure add( i : integer); virtual; abstract; end; B = class(A) ab : array of integer; procedure add( i : integer); override; end; C = class(A) ac : array of integer; procedure add( i : integer); override; end; procedure B.add( i : integer); override; begin setlength(ab,length(ab)+1); ab[high(ab)] := i; end; procedure C.add( i : integer); override; begin setlength(ac,length(ac)+1); ab[high(ac)] := i; end; Вариант второй - generic Код:
type class TA<T> a : array Of T; procedure Add(i : T); end; procedure TA<T>.Add(i : T); begin setlength(a,length(a)+1); a[high(a)] := i; end; ... var b : TA<integer>; c : TA<int64>; begin b := TA<integer>.create; c := TA<int64>.create; ... |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
kenshi245 (20.06.2017)
|
#3
|
|||
|
|||
Цитата:
Второй вариант мне не очень подходит, так как названия массивов у меня всегда разные, а первый довольно громоздкий, так как у меня оч много однотипных классов. Вот попробовал таким способом, получаем массив, добавляем, возвращаем массив. Но не работает, out of memory... В чем тут проблема? Код:
function tm_pathbuild.add_item( obj : tobject; list : array of tobject ): array of tobject; var i:integer; begin setlength( result, length( list ) + 1 ); for i := 0 to ( high( list ) ) do result[ i ] := list[ i ]; result[ high( result ) ] := obj; end; |
#4
|
|||
|
|||
А может просто тогда перейти на контейнеры типа TList и TObjectList? Они изначально являются указателями.
|