Visibility of class members |
Top Previous Next |
What is translated > Types > Records, Classes, Interfaces > Class > Visibility of class members In Delphi Members at the beginning of a VCL class declaration that don’t have a specified visibility are by default published and in other classes they are public. In C++ this is written explicitly. (Delphi2Cpp ignores the {$M+} directive, which would make them public.)
A problem at the translation of Delphi code is, that in Delphi a private or protected member is visible everywhere in the module where its class is declared. In C++ a private or protected member is visible only inside of the class. Delphi2Cpp solves this problem by making all classes in the same module to friends of each other. Free routines also are declared as friend.
The following Delphi code is an example, where the direct translation to C++ code would not compile, if TFriend isn't declared as a friend of TLonely:
TFriend = class private FCount: Integer; end;
TLonely = class(TFriend) public procedure NeedsFriend; end;
implementation
procedure TLonely.NeedsFriend; begin FCount := 0; // in C++ access to TLonely::FCount is not possible end;
The converted C++ code doesn't compile, because FCount cannot be accessed in TLonely::NeedsFriend.
unit friends;
type
class TFriend : public TObject { private: int FCount; public: __fastcall TFriend(); };
class TLonely : public TFriend { public: void __fastcall NeedsFriend(); __fastcall TLonely(); };
void __fastcall TLonely::NeedsFriend() { bool result = false; FCount = 0; // in C++ access to TLonely::FCount is not possible return result; }
Delphi2Cpp therefore lists all possible class- and routine- friend declarations of a unit into a file and includes it into all class declarations. The name of this file is created by appending "_friends" to the file name. The file gets the extension ".inc". The class declarations of the example therefore becomes to:
class TFriend : public TObject { #include "friends_friends.inc" private: int FCount; public: __fastcall TFriend(); };
class TLonely : public TFriend { #include "friends_friends.inc" public: bool __fastcall NeedsFriend(); __fastcall TLonely(); };
The content of "friends_friends.inc" is:
friend class TFriend; friend class TLonely;
Now TLonely::NeedsFriend compiles without problem. If this function were no member function, but a free function like:
procedure NeedsFriend; var f : TFriend; begin f := TFriend.Create; f.FCount := 0; // in C++ access to TLonely::FCount is not possible ...
Delphi2Cpp adds another line to "friends_friends.inc"
friend class TFriend; friend class TLonely; friend void __fastcall NeedsFriend();
Now
void __fastcall NeedsFriend() { TFriend* F = NULL; F = new TFriend(); F->FCount = 0;
also compiles without problem.
|
This page belongs to the Delphi2Cpp Documentation |
Delphi2Cpp home Content |