15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


DECLARE/IMPLEMENT_DYNACREATE()

Mario Contestabile -- Mario_Contestabile.UOS__MTL@UOSMTL2.universal.com
Tuesday, April 30, 1996

MSVC 4.1 (NT 3.51 SP4, Win95 SP1)

The following code should not compile if "B_member" is not a public member of 
class B:

class A{
   B m_BClass;
};

// A ctor
A::A(){
   m_BClass.B_member = 5;  // "B_member" must obviously be public
}

If class "B" uses DECLARE/IMPLEMENT_DYNACREATE() it will compile
and run even if "B_member" is *private*.

Do the macros change the access specifiers for members or perform other magic 
tricks?

mcontest@universal.com





bop@gandalf.se
Wednesday, May 01, 1996

> From Mario Contestabile  
>
> MSVC 4.1 (NT 3.51 SP4, Win95 SP1)
>
> The following code should not compile if "B_member" is not a public member of 
> class B:
>
> class A{
>    B m_BClass;
> };
>
> // A ctor
> A::A(){
>    m_BClass.B_member = 5;  // "B_member" must obviously be public
> }
>
> If class "B" uses DECLARE/IMPLEMENT_DYNACREATE() it will compile
> and run even if "B_member" is *private*.
>
> Do the macros change the access specifiers for members or perform other magic 
> tricks?

No "magic" really, but if you look closely at the code below (from afx.h)
you will see that the macros "sneak in" a "public" keyword.

DECLARE_DYNCREACTE calls DECLARE_DYNAMIC, which
contains a "public:".

//////////////////////////////////////////////////////////////////////////////
// Helper macros for declaring CRuntimeClass compatible classes

#ifdef _AFXDLL
#define DECLARE_DYNAMIC(class_name) \
protected: \
 static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
 static AFX_DATA CRuntimeClass class##class_name; \
 virtual CRuntimeClass* GetRuntimeClass() const; \

#else
#define DECLARE_DYNAMIC(class_name) \
public: \
 static AFX_DATA CRuntimeClass class##class_name; \
 virtual CRuntimeClass* GetRuntimeClass() const; \

#endif

// not serializable, but dynamically constructable
#define DECLARE_DYNCREATE(class_name) \
 DECLARE_DYNAMIC(class_name) \
 static CObject* PASCAL CreateObject();

#define DECLARE_SERIAL(class_name) \
 DECLARE_DYNCREATE(class_name) \
 friend CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb);



Bo Persson
bop@gandalf.se




| Вернуться в корень Архива |