동적 배열을 사용하는 레코드 유형을 만들고 싶습니다. = 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)
두 가지 문제가 있습니다
- 내 TMyRec, (A)에 연산자를 할당 재정의 사용하지 않는 경우 : =이 는 A와 B (자신의 Inner_Array가) 메모리에 같은 장소를 가리키는 의미 B.
- 내가 사용하여 할당 연산자 를 오버로드 할) 문제 1을 방지하려면 :
클래스 연산자 TMyRec.Implicit (출처 : TMyRec) : TMyRec;
하지만 compilator은 (델파이 XE)는 말한다 :
이[DCC 오류] : E2521 운영자 '암시'매개 변수 또는 결과 유형에 하나의 'TMyRec'형식을 취해야하는
이 문제를 해결하는 방법 . stackoverflow에 대한 몇 가지 유사한 게시물을 읽었지만 (잘 이해한다면) 내 상황에서는 작동하지 않습니다.
Artik
대신 'TMyRec.Clone' 함수를 도입하십시오. –
'Inner_Array'를 불변으로 만들어야합니다; A.Inner_Array [1] : = 1;과 같은 코드는 금지됩니다. Inner_Array에 대한 모든 쓰기는 새로운 배열 인스턴스를 만들어야합니다. 더 많은 힌트를 얻으려면 http://sergworks.wordpress.com/2013/04/10/on-the-operator-overloading-in-delphi/도 읽어보십시오. – kludg
@ user246408 변경할 수없는 벡터/행렬 형식은 일반적으로 불편하여 성능이 좋지 않습니다. 예를 들어, 많은 매트릭스 알고리즘이 제자리에서 작동합니다. –