From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=BAYES_00,INVALID_MSGID, REPLYTO_WITHOUT_TO_CC autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 109fba,2f84446733b06aca X-Google-Attributes: gid109fba,public X-Google-Thread: 103376,2f84446733b06aca X-Google-Attributes: gid103376,public From: Stephen Leake Subject: Re: Converting C++ class to Ada Date: 1996/12/13 Message-ID: <32B18347.52AB@gsfc.nasa.gov>#1/1 X-Deja-AN: 203928052 references: <32ADF183.7195@lmtas.lmco.com> <32AECEBE.2B5D@gsfc.nasa.gov> content-type: text/plain; charset=us-ascii organization: NASA Goddard Space Flight Center -- Greenbelt, Maryland USA mime-version: 1.0 reply-to: Stephen.Leake@gsfc.nasa.gov newsgroups: comp.lang.ada,comp.lang.c++ x-mailer: Mozilla 3.0 (Win95; U) Date: 1996-12-13T00:00:00+00:00 List-Id: Since yesterday, I've talked to a C++ guru, and have some further information :) Stephen Leake wrote: > > Ken Garlington wrote: > > > > In an attempt to better understand both C++ and Ada, I've been > > converting some C++ code into Ada. I'm struggling with this particular > > class: > > > > class CTableXY > > { > > public: > > CMotor& XMotor; > > CMotor& YMotor; > > CSwitch& XLimit; > > CSwitch& YLimit; > > CTableXY( CMotor& xmotor, CMotor& ymotor, > > CSwitch& xlim, CSwitch& ylim ) : > > XMotor(xmotor), YMotor(ymotor), > > XLimit(xlim), YLimit(ylim) {} > > void SetVelocityX( float vel ) > > { XMotor.SetSpeed( vel ); } > > void SetVelocityY( float vel ) > > { YMotor.SetSpeed( vel ); } > > int GetSwitchX( void ) { return > > XLimit.isOpen(); } > > int GetSwitchY( void ) { return > > YLimit.isOpen(); } > > }; > > > > It seems to me that the straightforward Ada translation is something > > like: > > > > with Motor, Switch; > > package Table_XY is > > > > type Motor_Access_Type is access all Motor.Object_Type'Class; > > type Switch_Access_Type is access all Switch.Object_Type'Class; > > > > type Object_Type is record > > X_Motor : Motor_Access_Type; > > Y_Motor : Motor_Access_Type; > > X_Limit : Switch_Access_Type; > > Y_Limit : Switch_Access_Type; > > end record; > > > > procedure Set_Velocity_X ( Object : in out Object_Type; > > Velocity : in Motor.Velocity_Type ); > > -- and so forth > > > > end Table_XY; > > I'm not clear why a class would have reference members, but if I were > building this type, the components of Object_Type would NOT be access > types; I want the class to have control over when they change. I'll > ignore this issue in the following. A C++ reference is a constant (it always refers to the same object), so using an access type in Ada definitely loses something (you can change what object it points to). My C++ guru says he uses references as class members mainly for temporary objects in windowing systems; binding a widget and a gidget together into a whatsis, where the widget and gidget already exist. > > > > > My main issues: > > > > (1) What do I do about the constructor? As I understand C++, > > I need to force the user to supply values for the components of > > Object_Type when something of that type is declared. How do I do > > this? > > Ahah! the Initialized component could be a discriminant without > defaults; then the user must provide a full aggregate when the object is > declared: > > type Object_Type (Initialized : BOOLEAN) is record > case Initialized is > when False => > null; > when True => > X_Motor : Motor_Access_Type; > Y_Motor : Motor_Access_Type; > X_Limit : Switch_Access_Type; > Y_Limit : Switch_Access_Type; > end case; > end record; Oops; this doesn't get there. It is perfectly legal to declare: Foo : Object_Type (True); and the fields exist without being initialized. -- - Stephe