gpt4 book ai didi

delphi - 如何使用尚未初始化的变量

转载 作者:行者123 更新时间:2023-12-03 15:57:35 25 4
gpt4 key购买 nike

我正在尝试创建一个包含字符串和节点数组的节点,但其他节点尚未创建,那么如何使用它们?我稍后需要在“节点中的所有边缘”循环中访问特定节点的边缘。它是一个图数据结构。该图是有向的,意味着节点 A 可以与 B 有连接,而 B 与 A 没有连接。

type
TNode = record
name: String;
edges: TNodeArray;
procedure Init(const aName: String; const aEdges: TNodeArray);
end;
TNodeArray = array of TNode;

procedure TNode.Init(const aName: String; const aEdges: TNodeArray);
begin
name := aName; edges := aEdges;
end;

function NewNode(const aName: String; const aEdges: TNodeArray): TNode;
begin
Result.Init(aName, aEdges);
end;

procedure Main;
var
n0, n1, n2, n3: TNode;
begin
n0 := NewNode('new york', TNodeArray.Create(n1, n2));
n1 := NewNode('london', TNodeArray.Create(n2));
n2 := NewNode('moscu', TNodeArray.Create(n1, n3));
n3 := NewNode('other city', nil); // 'other city' has no connections
end;

最佳答案

评论里发现,这是一个有向图。如果是这样,你可以使用这样的东西:

type
TNode = class
strict private
FName: string;
FOutgoingArcs: TList<TNode>;
function GetOutgoingArc(Index: Integer): TNode;
function GetOutgoingArcCount: Integer;
public
constructor Create(const AName: string);
procedure AddOutgoingArc(ANode: TNode);
procedure AddOutgoingArcs(const ANodes: array of TNode);
property OutgoingArcs[Index: Integer]: TNode read GetOutgoingArc;
property OutgoingArcCount: Integer read GetOutgoingArcCount;
property Name: string read FName write FName;
destructor Destroy; override;
end;

implementation

{ TNode }

procedure TNode.AddOutgoingArc(ANode: TNode);
begin
FOutgoingArcs.Add(ANode)
end;

procedure TNode.AddOutgoingArcs(const ANodes: array of TNode);
var
Node: TNode;
begin
for Node in ANodes do
AddOutgoingArc(Node);
end;

constructor TNode.Create(const AName: string);
begin
FName := AName;
FOutgoingArcs := TList<TNode>.Create;
end;

destructor TNode.Destroy;
begin
FOutgoingArcs.Free;
inherited;
end;

function TNode.GetOutgoingArcCount: Integer;
begin
Result := FOutgoingArcs.Count;
end;

function TNode.GetOutgoingArc(Index: Integer): TNode;
begin
Result := FOutgoingArcs[Index];
end;

我还认为跟踪单个列表中的所有节点是很好的,所以我会这样做

var
Nodes: TObjectList<TNode>;

function CreateNode(const AName: string): TNode;
begin
Result := TNode.Create(AName);
Nodes.Add(Result);
end;

现在我们可以玩了(确保先创建 Nodes: Nodes := TObjectList<TNode>.Create(True{say}) ):

var
NewYork,
London,
Paris,
Moscow: TNode;
begin

NewYork := CreateNode('New York');
London := CreateNode('London');
Paris := CreateNode('Paris');
Moscow := CreateNode('Moscow');

NewYork.AddOutgoingArc(London);
London.AddOutgoingArcs([NewYork, Paris, Moscow]);
Paris.AddOutgoingArcs([London, Moscow]);
Moscow.AddOutgoingArc(NewYork);

但是当然有一千种设计方法。这只是一种可能的解决方案。

更新:

请注意,只有一个名为“London”的对象,因此如果您将其更改为“via Paris”,则会看到“via New York”:

Paris.OutgoingArcs[0].Name := 'The Capital of the United Kingdom';

现在

NewYork.OutgoingArcs[0].Name

也是'The Capital of the United Kingdom' .

另请注意,与

Nodes := TObjectList<TNode>.Create(True)

节点将由Nodes拥有对象列表(这就是 True 的意思),因此当 Nodes 时它们将被释放被释放了。因此,例如,如果您在自己的类中使用这些节点 TTravelPlanner ,您可能想要创建 NodesTTravelPlanner.Create并做Nodes.FreeTTravelPlanner.Destroy .

关于delphi - 如何使用尚未初始化的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61385863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com