2015-10-06 6 views
6

Delphi documentation कहना है कि यह इंक और दिसं ऑपरेटरों ओवरलोड संभव है; मुझे ऐसा करने का कोई वैध तरीका नहीं दिखता है। इंक ऑपरेटर को अधिभारित करने के प्रयास यहां दिए गए हैं; कुछ प्रयास त्रुटियों को संकलित करने के लिए नेतृत्व, कुछ पहुँच उल्लंघन (डेल्फी XE) क्रम के लिए:कैसे डेल्फी में इंक (डीईसी) ऑपरेटरों ओवरलोड?

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. 

उत्तर

7

ऑपरेटर के हस्ताक्षर गलत है। यह होना चाहिए:

class operator Inc(const A: TMyInt): TMyInt; 

या

class operator Inc(A: TMyInt): TMyInt; 

आप एक var पैरामीटर का उपयोग नहीं कर सकते।

 
1 

चर्चा

यह एक नहीं बल्कि असामान्य ऑपरेटर जब अतिभारित है:

इस कार्यक्रम

{$APPTYPE CONSOLE} 

type 
    TMyInt = record 
    FValue: Integer; 
    class operator Inc(const A: TMyInt): TMyInt; 
    property Value: Integer read FValue write FValue; 
    end; 

class operator TMyInt.Inc(const A: TMyInt): TMyInt; 
begin 
    Result.FValue := A.FValue + 1; 
end; 

procedure Test; 
var 
    A: TMyInt; 
begin 
    A.FValue := 0; 
    Inc(A); 
    Writeln(A.FValue); 
end; 

begin 
    Test; 
    Readln; 
end. 

इस उत्पादन पैदा करता है। उपयोग के मामले में ऑपरेटर एक जगह में उत्परिवर्तन है। हालांकि, जब अधिभारित होता है, तो यह एक अतिरिक्त ऑपरेटर की तरह काम करता है जिसमें एक अंतर्निहित जोड़ होता है।

तो, यह रेखा से ऊपर कोड में:

Inc(A); 

प्रभावी रूप से

A := TMyInt.Inc(A); 

में तब्दील हो और फिर संकलित किया गया है।

आप सच में जगह उत्परिवर्तन अर्थ विज्ञान को बनाए रखने, और इस ऑपरेटर के साथ जुड़े नकल से बचने के लिए इच्छुक रहे हैं, तो मुझे विश्वास है कि आप प्रकार की एक विधि का उपयोग करने की जरूरत है।

procedure Inc; inline; 
.... 
procedure TMyInt.Inc; 
begin 
    inc(FValue); 
end; 
+1

कॉन्स्ट पैरामीटर का उत्परिवर्तन अजीब लगता है, है ना? रिटर्न वैल्यू के साथ फ़ंक्शन प्रोटोटाइप को अनदेखा किया जा सकता है? – kludg

+1

यह कॉल स्थल पर उत्परिवर्तन की तरह दिखता है, लेकिन संकलक तब्दील 'इंक (मींट)' 'मींट में: = TMyInt.Inc (मींट);' हाँ, यह बहुत अजीब बात है। मैं 'इंक' और 'दिसंबर' को अधिभारित नहीं करूंगा। –

संबंधित मुद्दे