2013-07-31 3 views
4

동적 배열을 사용하는 레코드 유형을 만들고 싶습니다. = B (및 기타) 아래 냈다 코드처럼 수정 B없는의 내용을 수정할 수 :Delphi에서 레코드 할당 연산자를 오버로드하는 방법

I는이 작업을 수행 할 수 있도록하려면이 형과 B를 변수 A를 사용

type 
     TMyRec = record 
     Inner_Array: array of double; 
     public 
     procedure SetSize(n: integer); 
     class operator Implicit(source: TMyRec): TMyRec; 
     end; 

    implementation 

    procedure TMyRec.SetSize(n: integer); 
    begin 
     SetLength(Inner_Array, n); 
    end; 

    class operator TMyRec.Implicit(source: TMyRec): TMyRec; 
    begin 
    //here I want to copy data from source to destination (A to B in my simple example below) 
    //but here is the compilator error 
    //[DCC Error] : E2521 Operator 'Implicit' must take one 'TMyRec' type in parameter or result type 
    end; 


    var 
     A, B: TMyRec; 
    begin 
     A.SetSize(2); 
     A.Inner_Array[1] := 1; 
     B := A; 
     A.Inner_Array[1] := 0; 
//here are the same values inside A and B (they pointed the same inner memory) 

두 가지 문제가 있습니다

  1. 내 TMyRec, (A)에 연산자를 할당 재정의 사용하지 않는 경우 : =이 는 A와 B (자신의 Inner_Array가) 메모리에 같은 장소를 가리키는 의미 B.
  2. 내가 사용하여 할당 연산자 를 오버로드 할) 문제 1을 방지하려면 :

    클래스 연산자 TMyRec.Implicit (출처 : TMyRec) : TMyRec;

하지만 compilator은 (델파이 XE)는 말한다 :

[DCC 오류] : E2521 운영자 '암시'매개 변수 또는 결과 유형에 하나의 'TMyRec'형식을 취해야하는

이 문제를 해결하는 방법 . stackoverflow에 대한 몇 가지 유사한 게시물을 읽었지만 (잘 이해한다면) 내 상황에서는 작동하지 않습니다.

Artik

+1

대신 'TMyRec.Clone' 함수를 도입하십시오. –

+2

'Inner_Array'를 불변으로 만들어야합니다; A.Inner_Array [1] : = 1;과 같은 코드는 금지됩니다. Inner_Array에 대한 모든 쓰기는 새로운 배열 인스턴스를 만들어야합니다. 더 많은 힌트를 얻으려면 http://sergworks.wordpress.com/2013/04/10/on-the-operator-overloading-in-delphi/도 읽어보십시오. – kludg

+0

@ user246408 변경할 수없는 벡터/행렬 형식은 일반적으로 불편하여 성능이 좋지 않습니다. 예를 들어, 많은 매트릭스 알고리즘이 제자리에서 작동합니다. –

답변

4

할당 연산자에 과부하를 걸 수 없습니다. 이것은 당신이하려고하는 것이 불가능하다는 것을 의미합니다.

+0

A : = B 할당을 잡아서 A에서 B로 데이터를 복사 할 수있는 방법이없는 것입니까? – Artik

+0

맞습니다 –

+2

동적 배열에 COW 기능을 도입 할 수 있습니다. 이것은'String' 타입이 작동하는 것처럼 배열에 쓸 때 복제를 처리합니다. 좀 지저분하지만, 제대로 작동하도록 만들었습니다. 나는 곧 코드를 발표 할 것이다. 중요한 것은 'SetLength','Length' 등의 내장 함수가 연산자 오버로드를 도입 할 수 없다는 것입니다. –

관련 문제