fpcl...@silvermono.co.za wrote:
On Sunday 07 June 2009 22:19:47 Jonas Maebe wrote:
On 07 Jun 2009, at 10:35, fpcl...@silvermono.co.za wrote:
A high level, a class is like a record that has been modified to
include
functions and procedures. I know that I'm over simplifying thing
here, please
bare with me.
The difference you skip over is the fundamental reason why one works
and the other doesn't: a class is a pointer, while a record is a value.

I understand the difference, but a pointer to a record still suffers the from the same problem as a pointer to a class i.e. if memory is not allocated then the code fails at runtime. It's interesting to note though, that Delphi allows the assignment to the fields of a record type property via the with - do construct. Is this also the case with FPC 2.3.1?
 property ARecord: TSomeRecorType read FTheRecord;
 property AClass: TSomeClassType read FTheClass;

must be treated the same as
 function GetARecord: TSomeRecorType;
 function GetAClass: TSomeClassType;

Why? Because that is what a property is for. A property means you are free to change the "read" part to use a getter-function. And doing that change *must* not break any code.

You can not (not in a sensible way) do
 GetARecord() := ....
Neither does it make sense to do
 GetARecord().X := ....

The last bit may be possible, but it would assign .X to a *temporary* copy of the record, same as
 MyTemp := GetARecord();
 MyTemp.X := ....

What is the Point of this assignment, the value is lost, and unless you actually have a temp variable (like in the expanded example) you can not even retrieve the assigned value.

However
 with GetARecord() do begin
     x := 5;  // only the temp copy
    writeln(x); // using the value from the temp copy
 end;

-------------
As for classes
  GetAClass()
does not return a temporary copy of your class, it return a temporary pointer to your class.

so the following makes NO sense
  GetAClass() := TClass.Create; // trying to replace the class

but
  GetAClass().X := 5;
following the temporary pointer still leads to the real object

-------------
This is because TClass behaves like a pointer.
Record does not behave like a pointer ** (the whole memory occupied by all values of the record is copied). **

This difference also applies if you pass such values as params to a procedure or function.


Martin






_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to