gpt4 book ai didi

pascal - 重载 Object Pascal 的赋值运算符

转载 作者:行者123 更新时间:2023-12-05 00:20:52 35 4
gpt4 key购买 nike

当分配运算符 := 时会发生什么?在 Object Pascal 中重载?我主要是指首先评估什么,更重要的是如何(如果可能)更改此顺序。这是一个让我烦恼的例子:

我声明TMyClass因此:

TMyClass = class
private
FSomeString: string;
class var FInstanceList: TList;
public
function isValid: boolean;
property SomeString: String write setSomeString;
end;
isValid函数检查 MyObject 中的 nil和悬空指针。

现在假设我想重载 :=运算符将字符串分配给 TMyClass。我还想检查我分配这个字符串的对象是否是一个有效的对象,如果不是创建一个新的,所以:
operator :=(const anewString: string): TMyClass;
begin
if not(result.isValid) then
result:= TMyObject.Create;
result.SomeString:= aNewString;
end;

简而言之,我希望结果会自动保存指向我分配的对象的指针。但是使用以下内容进行测试:
procedure TForm1.TestButtonClick(Sender: TObject);
var
TestObject: TMyObject;
begin
TestObject:= TMyObject.Create;
TestObject:= 'SomeString';
TestObject.Free;
end;

让我相信 result 的中间值先赋值,实际赋值给 TestObject发生在 := 中的代码之后执行。

我所知道的关于编码的一切都是自学的,但这个例子表明我显然在某个地方错过了一些基本概念。

我知道有比重载 := 更简单的方法来做到这一点。运算符(operator),但出于科学的好奇心,有什么方法可以让这段代码工作吗? (无论多么复杂。)

最佳答案

使用运算符重载不可能做你想做的事。你必须使用一种方法。

问题是 :=运算符不会让您访问左侧 (LHS) 参数(这里是 Self ,指向当前实例的指针),而只能访问右侧参数。

当前在您的示例中 if not(result.isValid) then是危险的,因为函数开头的结果是未定义的(它可以有任何值,可以是 nil 也可以不是 nil,当不是 nil 时,调用 isValid 将导致一些可能的违规访问。它根本不代表 LHS .

使用常规方法,您可以访问 Self你可以调用isValid .

关于pascal - 重载 Object Pascal 的赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33453250/

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