6
Delphi documentationは、Inc演算子とDec演算子をオーバーロードする可能性があることを示しています。私はそれを行う有効な方法を参照してください。 Inc演算子をオーバーロードしようとする試みがあります。いくつかの試みはエラーをコンパイルし、一部は実行時アクセス違反(Delphi XE)につながります:DelphiでInc(Dec)演算子をオーバーロードする方法は?
program OverloadInc;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TMyInt = record
FValue: Integer;
// class operator Inc(var A: TMyInt); DCC error E2023
class operator Inc(var A: TMyInt): TMyInt;
property Value: Integer read FValue write FValue;
end;
class operator TMyInt.Inc(var A: TMyInt): TMyInt;
begin
Inc(A.FValue);
Result:= A;
end;
type
TMyInt2 = record
FValue: Integer;
class operator Inc(A: TMyInt2): TMyInt2;
property Value: Integer read FValue write FValue;
end;
class operator TMyInt2.Inc(A: TMyInt2): TMyInt2;
begin
Result.FValue:= A.FValue + 1;
end;
procedure Test;
var
A: TMyInt;
begin
A.FValue:= 0;
Inc(A);
Writeln(A.FValue);
end;
procedure Test2;
var
A: TMyInt2;
I: Integer;
begin
A.FValue:= 0;
// A:= Inc(A); DCC error E2010
Writeln(A.FValue);
end;
begin
try
Test; // access violation
// Test2;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
constパラメータの突然変異が奇妙に見えますか?戻り値の関数プロトタイプも無視されますか? – kludg
コールサイトでは突然変異のようですが、コンパイラは 'Inc(MyInt)'を 'MyInt:= TMyInt.Inc(MyInt);に変換します。私は 'Inc'と' Dec'を過負荷にしないだろう。 –