Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Generics und Typparameter (https://www.delphipraxis.net/164282-generics-und-typparameter.html)

Codewalker 6. Nov 2011 16:10

Generics und Typparameter
 
Hallo zusammen.

Ich möchte mir eine generische Klasse für einen einfachen Ringspeicher schreiben. Dazu verwalte ich (genau wie
Delphi-Quellcode:
TList<T>
) die Elemente des Speichers in einem
Delphi-Quellcode:
array of T
. Das compiliert soweit ganz gut, bis ich die Add-Funktion implementieren will. Dann bekomme ich den Fehler:

Code:
E2571 Typparameter 'T' hat keine Klassen- oder Interface-Einschränkung
Was soll mir das sagen und warum kann ich es nicht genau so machen wie bei TList. Hier mal der auf nötigste zusammengestrichene Code:

Delphi-Quellcode:
type
 TRing<T> = class(TEnumerable<T>)
 private
  FItems: array of T;
 {...}
 public
   procedure Add(const Value: T);
   {...}
 end;

{...}

procedure TRing<T>.Add(const Value: T);
var
  Pos: Integer;
begin
  Pos := (Current + 1) mod Size;
  FItems[Pos] := T;  // <- hier meckert er
end;
Die Add-Methode einer einfachen Liste scheint aber genau so zu funktionieren. Also .. was tun? :cry:

jbg 6. Nov 2011 16:12

AW: Generics und Typparameter
 
Ändere das T mal in Value ab:

Delphi-Quellcode:
FItems[Pos] := Value; // <- hier meckerte er

Codewalker 6. Nov 2011 16:17

AW: Generics und Typparameter
 
grks, manchmal wird man einfach betriebsblind (wobei die Fehlermeldung nicht hilfreich war).
Danke Dir :oops:

jaenicke 6. Nov 2011 18:23

AW: Generics und Typparameter
 
So einen Ringspeicher habe ich gerade erst implementiert. Dabei habe ich für den Zugriff auf die Elemente zu Pointern gegriffen, so dass ich auch Records darin speichern und direkt darauf zugreifen kann.

// EDIT:
Sprich:
Delphi-Quellcode:
  TCircularBuffer<T> = class
  public
    type
      TBufferPointer = ^T;
  strict private
    var
      FElements: TArray<T>;
  [...]
  public
    type
      TBufferEnumerator = class(TEnumerator<TCircularBuffer<T>.TBufferPointer>)
      [...]
    procedure Next;
    function GetEnumerator: TBufferEnumerator;
    property Current: TBufferPointer read GetCurrent;
    property Size: Integer read GetSize write SetSize;
    property Element[AIndex: Integer]: TBufferPointer read GetElement; default;
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz