Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.06.2017, 17:15
kenshi245 kenshi245 вне форума
Прохожий
 
Регистрация: 08.06.2017
Сообщения: 16
Версия Delphi: Delphi
Репутация: -625
По умолчанию Как мне передать указатель?

Подскажите как сделать чтобы наследуемый метод 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  
Старый 19.06.2017, 21:17
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

ну тут надо по другому - либо в родителе метод абстрактрый и реализован в потомках, либо шаблоны/дженерики.

Вариант первый - классическое ООП:
Код:
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  
Старый 20.06.2017, 12:35
kenshi245 kenshi245 вне форума
Прохожий
 
Регистрация: 08.06.2017
Сообщения: 16
Версия Delphi: Delphi
Репутация: -625
По умолчанию

Цитата:
Сообщение от lmikle
ну тут надо по другому - либо в родителе метод абстрактрый и реализован в потомках, либо шаблоны/дженерики.

Вариант первый - классическое ООП:
Код:
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;
  ...

Второй вариант мне не очень подходит, так как названия массивов у меня всегда разные, а первый довольно громоздкий, так как у меня оч много однотипных классов.

Вот попробовал таким способом, получаем массив, добавляем, возвращаем массив. Но не работает, 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  
Старый 20.06.2017, 17:50
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А может просто тогда перейти на контейнеры типа TList и TObjectList? Они изначально являются указателями.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:32.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter