cast class references to void and back
Regan Heath
regan at netmail.co.nz
Tue Sep 18 03:42:09 PDT 2007
BLS wrote:
> BLS schrieb:
>>
>> From the D spec;
>>
>> Pointer Conversions
>> Casting pointers to non-pointers and vice versa is allowed in D,
>> however, do not do this for any pointers that point to data allocated
>> by the garbage collector.
>>
>> Given :
>> Class CWin : CMsg
>> {
>> Cwin pWnd = null; // create a refrence
>>
>> /* C++
>> pWnd =
>> reinterpret_cast<CWin*>((long)((LPCREATESTRUCT)lParam)->lpCreateParams);
>> */
>>
>> // D probabely
>> pWnd = cast(CWin)(cast(LPCREATESTRUCT)lParam).lpCreateParams;
>>
>> }
>>
>> The LPCREATESTRUCT from WinUser.d
>> struct CREATESTRUCTA {
>> LPVOID lpCreateParams; // Here I am
>> HINSTANCE hInstance;
>> HMENU hMenu;
>> HWND hwndParent;
>> // etc.
>> }
>> alias CREATESTRUCTA* LPCREATESTRUCTA;
>>
>> So :
>> 1) Do I have to put a cast(int) in there (where the (long) was in C++)
>> The reason you would use 'int' and not 'long' is that long in C++ is
>> typically 32 bits and long in D is 64 bits.
>>
>> 2) I'm not 100% certain that it is guaranteed to work if you cast
>> class references to void and back again. Someone else might be able
>> to confirm/deny this.
>> 3) Following the D spec. this is also not guaranteed to work.
>> confirm/deny ?
>>
>> Thanks in advance
>> Bjoern
>
> Still someone out there who is still mental health ? 'cause const
> discussion :-)
>
> In this case just another question,
> In case that I define
> Class CWnd
> {
> CWnd* pWnd = 0;
>
> }
> Do I have then in fact CWin** (from a C++ view) ?
Sort of, you have a pointer to a reference to a Cwnd class object.
Where a 'reference' is like but not exactly the same as a pointer.
Regan
More information about the Digitalmars-d
mailing list