Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verkettete Liste von Objekten (https://www.delphipraxis.net/45426-verkettete-liste-von-objekten.html)

Pseudemys Nelsoni 6. Mai 2005 07:12


Verkettete Liste von Objekten
 
hi,

wenn ich eine verkettete liste von objekten (meinet wegen TObject) habe, ist es normal das ich Trotzdem New() vor dem dereferenzieren benutzen muss?

ich meine das sieht für mich quatsch aus:

Delphi-Quellcode:
proceudre someproc;
var
  Objekt: PObject;
begin
  New(Objekt)
  Objekt := TObject.Create;
end;


ist das nicht irgendwie doppelt gemoppelt?

ohne New() gehts jedenfalls nicht...

Die Frage ist hier nur ob es so richtig ist.

Robert_G 6. Mai 2005 07:32

Re: Verkettete Liste von Objekten
 
Warum nimmst du auch ein PObject? :shock:
Mit dem Constructor reservierst du doch nur Speicher, der über die Objektvariable als Zeiger zugreifbar ist.
Der Zeiger auf den Zeiger muss natürlich weiter mit New() im Heap landen.
Mach' das bitte weg. Das tut doch weh. :cry:

Pseudemys Nelsoni 6. Mai 2005 07:37

Re: Verkettete Liste von Objekten
 
Moin Robert,

Für was muss New() denn noch Speicher auf dem Heap reservieren? Nur für einen Pointer?

Da ich eine verkettete Liste brauche wüsste ich nur einen anderen weg wie das geht und zwar so:

Delphi-Quellcode:
TMyClass = class;
TMyClass = class(TObject)
private
  Next: TMyClass;
public

end;
wäre das richtig? Also so eine vorwärtsdeklaration?

SirThornberry 6. Mai 2005 07:55

Re: Verkettete Liste von Objekten
 
genau so geht das, und die forwardeklaration brauchst du auch nicht.

Robert_G 6. Mai 2005 07:56

Re: Verkettete Liste von Objekten
 
Du brauchst dort keine forward declaration. ;)
Du brauchst auch keinen Pointer. Ein Object ist doch bereits ein Pointer. Bzw. Die Variable mit der du auf das Objekt zugreifst ist immer einer...

Ich habe gerade was aus einem meiner Templates kopiert (und natürlich etwas beschnitten ;) ).
Dieser Node ist aber nicht für Performance ausgelegt sondern dafür, dass er die Liste und damit die darüberliegende Collection über Änderungen benachrichtigen kann ;)
Delphi-Quellcode:
  _TYPED_LIST_NODE_ = class(...,)
  private
    fNext: _TYPED_LIST_NODE_;
    fPrevious: _TYPED_LIST_NODE_;
    fData: _TYPED_LIST_LIST_DATA_;
    ...
  protected
    procedure setNext(const aValue : _TYPED_LIST_NODE_);virtual;
    procedure setPrevious(const aValue : _TYPED_LIST_NODE_);virtual;
    procedure setData(const aValue : _TYPED_LIST_LIST_DATA_);virtual;
    ...
  public
    property Next: _TYPED_LIST_NODE_ read fNext write setNext;
    property Previous: _TYPED_LIST_NODE_ read fPrevious write setPrevious;
    property Data: _TYPED_LIST_LIST_DATA_ read fData write setData;
    ...
    constructor Create(...); overload;virtual;
    constructor Create(aData: _TYPED_LIST_LIST_DATA_); overload;virtual;
    destructor Destroy(); override;
  end;

Pseudemys Nelsoni 7. Mai 2005 05:27

Re: Verkettete Liste von Objekten
 
Danke euch ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:40 Uhr.

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