[fpc-pascal] WHY compiler should be public?

Michael Van Canneyt michael at freepascal.org
Sun Oct 27 12:17:09 CET 2013



On Sun, 27 Oct 2013, Xiangrong Fang wrote:

> 2013/10/25 Michael Van Canneyt <michael at freepascal.org>
>       Why not simply make it a procedure that is called by ver-2 and ver-3.
> 
> If it cannot be called directly from external code, and will called only from inside a visible consructor, there is simply no reason to make this procedure a constructor. A simple procedure will do.
> 
> 
> ​Because I don't know how to make it non-constructor. See the following code:
> 
>   1 unit wtree;
>   2 {$mode objfpc}{$H+}
>   3 interface
>   4 uses tree;
>   5 type
>   6   TQWordTree = specialize TTree<QWord>;
>   7   TWTree = class(TQWordTree)
>   8   private
>   9     FModel: string;
>  10   public
>  11     property Model: string read FModel;
>  12     constructor Create(AData: QWord; AParent: TWTree; AModel: string);
>  13     constructor Create(HeadNode, TailNode: QWord);
>  14   end;
>  15 implementation
>  16
>  17 constructor TWTree.Create(AData: QWord; AParent: TWTree; AModel: string);
>  18 begin
>  19   inherited Create(AData, AParent);
>  20   FModel := AModel;
>  21 end;
>  22
>  23 constructor TWTree.Create(HeadNode, TailNode: QWord);
>  24 begin
>  25   inherited Create(0, nil);
>  26   Data := HeadNode;
>  27   with TWTree do Create(TailNode, Create(HeadNode, Self, 'h'), 't');
>  28   FModel := 'R';
>  29 end;
>  30
>  31 end.
> 
> Please tell me how to deal with line 27, which called the should-be-private constructor.

Ah. The 'private' constructor is called FROM ANOTHER INSTANCE. You didn't say that.

That currently can't be done.

Michael.

> 
> BTW, this code uses TTree class, which is here:
> 
> https://github.com/xrfang/fpcollection/blob/master/src/units/tree.pas
> 
> Also,
> ​ ​I don't understand why this does not work:
> 
> f := TFileStream.Create;
> 
> I know that TFileStream's Create require a file name parameter, but as TFileStream is inherited from TObject, which has a Create without parameter.  This is why I feel that it is possible to HIDE a public
> constructor from ancestor.

I think this is a bug :)

Michael.


More information about the fpc-pascal mailing list