Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2017-02

Parameterless constructors are not allowed in records or record/type helpers

10 messages · 3 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Ryan Joseph

Why is this restriction in place and what are the alternatives if any? Some times I want to just provide a method that sets default values for a record without any parameters but FPC doesn’t let me for some reason.

Regards,
Ryan Joseph

Sven Barth
"Ryan Joseph" wrote
Why is this restriction in place and what are the alternatives if any?

Some times I want to just provide a method that sets default values for a record without any parameters but FPC doesn’t let me for some reason.

Delphi compatibility.
As a workaround you could add a constructor with a default parameter.

Regards,
Sven

Ryan Joseph
to Sven Barth
On Feb 5, 2017, at 3:27 PM, Sven Barth wrote: constructor with a default parameter.

How? never heard of this. Thanks.

Regards,
Ryan Joseph

Ryan Joseph
to Sven Barth

I never knew Pascal had default parameters, a feature I always use and enjoy in PHP. Once again I learn something new about the language I use. :)

However, the constructor with default params does not work. I get the same error as before. {$modeswitch advancedrecords} is on.

type
	MyRecord = record
		x: integer;
		constructor Foo (_x: integer = 0);
	end;
On Feb 5, 2017, at 8:29 PM, Sven Barth wrote: See here at the bottom: http://freepascal.org/docs-html/current/ref/refsu65.html#x176-19800014.4.1 (it's the same for any kind of routine: function, procedure, method, constructor...)

Regards,
Ryan Joseph

Maciej Izak
to Ryan Joseph

2017-02-05 14:34 GMT+01:00 Ryan Joseph :

Show quoted text 9 lines
However, the constructor with default params does not work. I get the same error as before. {$modeswitch advancedrecords} is on. type MyRecord = record x: integer; constructor Foo (_x: integer = 0); end;

AFAIK this is by design. In theory "constructor Create;" is reserved for record "Initializers" (which means initialization for managed fields of record). Parameter less constructor doesn't have much sense for records. Use "class function Foo: MyRecord ;" instead. Probably syntax "constructor Create;" will be used for record initializers in next Delphi releases (around 2018?). In FPC we have implemented this feature (not merged yet : http://bugs.freepascal.org/view.php?id=30687 ) but as "class operator Initialize(var a: MyRecord);".

Best regards, Maciej Izak
Sven Barth
to Ryan Joseph: I never knew Pascal had default parameters, a feature I always use and enjoy in PHP. Once…
"Ryan Joseph" wrote
I never knew Pascal had default parameters, a feature I always use and

enjoy in PHP. Once again I learn something new about the language I use. :)

I suggest you to read through the language reference guide then ;)

However, the constructor with default params does not work. I get the

same error as before. {$modeswitch advancedrecords} is on.

Oh, well, it was worth a shot... Alternatively you could declare a class function named Create that returns an instance of the record. Even Delphi is using that for Rtti.TRttiContext.

Regards,
Sven

Ryan Joseph
to Sven Barth

I tried class functions in records already but I got the error "Class methods must be static in records”. Not sure what that means but I assumed they don’t work either.

Too bad, that would be a nice feature.

On Feb 6, 2017, at 2:29 AM, Sven Barth wrote: Oh, well, it was worth a shot... Alternatively you could declare a class function named Create that returns an instance of the record. Even Delphi is using that for Rtti.TRttiContext.

Regards,
Ryan Joseph

Sven Barth
to Ryan Joseph
"Ryan Joseph" wrote
I tried class functions in records already but I got the error "Class

methods must be static in records”. Not sure what that means but I assumed they don’t work either.

You need to add the "static" modifier to the method. Class functions in records can't have a self parameter and the "static" disables that. That's why.

Regards,
Sven

Ryan Joseph
to Sven Barth

Thanks got it now. Not ideal but it works and is a small improvement over a function.

Show quoted text 5 lines
On Feb 6, 2017, at 2:06 PM, Sven Barth wrote: You need to add the "static" modifier to the method. Class functions in records can't have a self parameter and the "static" disables that. That's why.

Regards,
Ryan Joseph