【发布时间】:2023-03-05 21:12:01
【问题描述】:
当赋值运算符:= 在 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 的实际分配发生在:= 中的代码执行之后。
我所知道的关于编码的一切都是自学的,但这个例子表明我显然在某个地方错过了一些基本概念。
我知道有比重载 := 运算符更简单的方法来做到这一点,但出于科学的好奇心,有什么方法可以让这段代码工作吗? (无论多么复杂。)
【问题讨论】:
-
这在语法中清晰可见。结果不是参考,所以它是一个由你填写的临时值。不,我认为这不能通过运算符重载来完成。也许有一个默认属性。
标签: pascal lazarus freepascal