Delphi 2006不会在记录方法中允许类型记录的const参数吗?
更新:简单的解决方法. Method / Operator字段之前的数据字段.
今天我尝试使用我能做的最简单的例子来重现这个bug. >我开始使用基本记录(TBasicRecord)只有简单的set和print方法(没有运算符),并且传递const x:TBasicBecord没有问题. 我也将我的数据字段设为私有,所以起初我认为这一定是问题所在,但最终结果却是无关紧要的.唯一有意义的是我是否在操作符和方法字段之前放置了数??据字段. 总的来说,我对这个决议很满意.我个人总是把数据字段放在第一位.有趣的是,反过来做它似乎没有引起任何其他问题,只要你不尝试将记录类型作为“const”参数传递到任何地方. 原始发布: 以前我一直在使用Delphi 7,但今天安装了Delphi 2006以获取D7不支持的运算符方法. 我试图编译一个早期问题的回复中列出的代码(复数实现):Request simple example of how to a TComplexMath class (source included) 以下是相关代码的部分列表: type TComplex = record public class operator Implicit(const D: Double): TComplex; class operator Negative(const C: TComplex): TComplex; class operator Equal(const C1,C2: TComplex): Boolean; class operator NotEqual(const C1,C2: TComplex): Boolean; class operator Add(const C1,C2: TComplex): TComplex; class operator Add(const C: TComplex; const D: Double): TComplex; class operator Add(const D: Double; const C: TComplex): TComplex; class operator Subtract(const C1,C2: TComplex): TComplex; class operator Subtract(const C: TComplex; const D: Double): TComplex; class operator Subtract(const D: Double; const C: TComplex): TComplex; class operator Multiply(const C1,C2: TComplex): TComplex; class operator Multiply(const C: TComplex; const D: Double): TComplex; class operator Multiply(const D: Double; const C: TComplex): TComplex; class operator Divide(const C1,C2: TComplex): TComplex; class operator Divide(const C: TComplex; const D: Double): TComplex; class operator Divide(const D: Double; const C: TComplex): TComplex; function IsZero: Boolean; function IsNonZero: Boolean; function Conj: TComplex; function Sqr: TComplex; function Sqrt: TComplex; function Mag: Double; function SqrMag: Double; public r: Double; c: Double; end; class operator TComplex.Negative(const C: TComplex): TComplex; begin Result.r := -C.r; Result.c := -C.c; end; ---- etc --- 问题是,当我尝试编译此代码时(在D2006中),每个采用TComplex类型的运算符都会产生错误E2037:“—-”的声明与前一个声明不同. (其中“—”是操作符名称). 我的工作是从每个TComplex参数中删除const关键字,然后代码正确地符合(并运行).我可以保留“const x:Double”参数,编译器没有给出错误,但是我不得不从其他所有参数中删除“const”. 有谁知道这是否是一些未启用的编译器选项?或者这是在Delphi的更高版本中支持的东西,而不是D2006?或者只是我做错了什么? 另外,如果我不能在这里使用const参数,那么将var替换为const是否有任何好处(与仅删除const关键字相比). 解决方法
你不应该用var替换const.让我解释一下原因.
背景 function Add(a: integer): integer; begin result := a + 5; end; 返回其参数5.尝试ShowMessage(IntToStr(Add(10))).你也可以这样做:= 10; ShowMessage(IntToStr(Add(a)))得到相同的结果.在这两种情况下,传递给Add函数的东西都是数字10.消息显示为15. var参数的预期用途如下: procedure Add(var a: integer); begin a := a + 5; end; var表示参数变量应该通过引用传递;也就是说,只应将指向参数变量的指针传递给过程/函数. 因此,现在你可以做到 a := 10; Add(a); ShowMessage(IntToStr(a)); // You get 15 现在你甚至不能做Add(10),因为10根本不是变量! 比较, function Add(a: integer): integer; begin a := a + 5; result := a; end; 不会影响一个.所以, a := 10; ShowMessage(IntToStr(Add(a))); // You get 15 ShowMessage(IntToStr(a)); // You get 10 现在,考虑一下这个可怕的功能: function Add(var a: integer): integer; begin a := a + 5; result := a; end; 这也会返回它的参数5,但它也会影响它的参数(非常夸张地!!),你不能传递除变量之外的任何东西作为参数(所以Add(10)将不起作用!!)! a := 10; ShowMessage(IntToStr(Add(a))); // You get 15 ShowMessage(IntToStr(a)); // You get 15 (!!!) 那么,const是什么?好吧,const大致意味着“如果可能的话,通过引用传递(加速;例如,你不需要复制大型记录),但绝不接受对参数的任何修改”.因此,const参数有效地作为普通参数起作用,除了你不能改变它: function Add(const a: integer): integer; begin result := a + 5; end; 同时工作 function Add(const a: integer): integer; begin a := a + 5; result := a; end; 甚至没有编译!但你仍然可以做Add(10). 相关案例 从这个讨论中,应该清楚的是你不应该用var替换const.确实, >如果从const更改为var,则函数不再接受文字(10)或表达式(标记30或SomeFunc(a,b))的参数.这是一个主要的表演者! 第一点的例子.使用const或普通参数: function Complex(a,b: real): TComplex; begin result.r := a; result.c := b; end; ... var c,d: TComplex; begin d := -c; // Works! d := -Complex(10,20); // Works! 但是使用var: var c,20); // [DCC Error] Unit5.pas(262): // E2015 Operator not applicable to this // operand type 这也不起作用(使用var): var a,b,c: TComplex; begin a := -(b + c); 实际上,现在Negative的论证不是变量,而是表达式b c.所以你输了很多! 第二点的例子.假设你有一个糟糕的一天,你认为负面的实施 class operator TComplex.Negative(var C: TComplex): TComplex; begin C.r := -C.r; C.c := -C.c; result := C; end; 那么下面的代码, var c,d: TComplex; begin c := Complex(10,20); d := -c; ShowMessage(FloatToStr(c.r)); ShowMessage(FloatToStr(d.r)); 曾经导致消息10和-10,将突然改变并产生-10,-10,这是非常意外的! 结论 因此,在您的情况下,解决方案只是简单地删除const(而不是用var替换它!). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |