|
| MFC og DECLARE_DYNCREATE Fra : Bear |
Dato : 09-07-02 08:44 |
|
Hvad er det lige DECLARE_DYNCREATE og IMPLEMENT_DYNCREATE benyttes til?
I stedet for at skrive almindeligt C++ kode som:
CMyClass* obj = new CMyClass();
skriver man
CRuntimeClass* pRuntimeClass = RUNTIME_CLASS( CMyClass );
CObject* pObject = pRuntimeClass->CreateObject();
Hvad er ideen bag denne mystiske måde at lave objekter på? Når contructoren
er protected kan man jo ikke lave objekter på stakken. Er det kun muligt at
lave objekter på heap'en i MFC?
MFC ligner mere et nyt makrosprog end C++.
Forresten, har C++ ikke en "instanceof" som i Java?
--
mvh
Bear
ICQ: 2745075
| |
Klaus Hebsgaard (09-07-2002)
| Kommentar Fra : Klaus Hebsgaard |
Dato : 09-07-02 09:21 |
|
"Bear" <bdr@NOSPAM.sol.dk> wrote in message news:age473$nrr$1@sunsite.dk...
> Hvad er det lige DECLARE_DYNCREATE og IMPLEMENT_DYNCREATE benyttes til?
>
> I stedet for at skrive almindeligt C++ kode som:
> CMyClass* obj = new CMyClass();
>
> skriver man
>
> CRuntimeClass* pRuntimeClass = RUNTIME_CLASS( CMyClass );
>
> CObject* pObject = pRuntimeClass->CreateObject();
>
> Hvad er ideen bag denne mystiske måde at lave objekter på? Når
contructoren
> er protected kan man jo ikke lave objekter på stakken. Er det kun muligt
at
> lave objekter på heap'en i MFC?
>
> MFC ligner mere et nyt makrosprog end C++.
>
> Forresten, har C++ ikke en "instanceof" som i Java?
IsKindof....
Fra hjælpen:
IMPLEMENT_DYNCREATE
IMPLEMENT_DYNCREATE( class_name, base_class_name )
Parameters
class_name
The actual name of the class (not enclosed in quotation marks).
base_class_name
The actual name of the base class (not enclosed in quotation marks).
Remarks
Use the IMPLEMENT_DYNCREATE macro with the DECLARE_DYNCREATE macro to enable
objects of CObject-derived classes to be created dynamically at run time.
The framework uses this ability to create new objects dynamically, for
example, when it reads an object from disk during serialization. Add the
IMPLEMENT_DYNCREATE macro in the class implementation file. For more
information, seeCObject Class Topics in Visual C++ Programmer's Guide.
If you use the DECLARE_DYNCREATE and IMPLEMENT_DYNCREATE macros, you can
then use the RUNTIME_CLASS macro and the CObject::IsKindOf member function
to determine the class of your objects at run time.
If DECLARE_DYNCREATE is included in the class declaration, then
IMPLEMENT_DYNCREATE must be included in the class implementation.
See Also DECLARE_DYNCREATE, RUNTIME_CLASS, CObject::IsKindOf
MVH
Klaus
| |
Mogens Hansen (09-07-2002)
| Kommentar Fra : Mogens Hansen |
Dato : 09-07-02 09:43 |
|
"Bear" <bdr@NOSPAM.sol.dk> wrote
[snip]
> Hvad er ideen bag denne mystiske måde at lave objekter på?
Så vidt jeg kan se af den udemærkede bog
Programming Windows with MFC, Second Edition
Jeff Prosise
ISBN 1-57231-695-0
side 506-507, så har det noget at gøre med at Doc/View modellen er meget
grundliggende for MFC, og for at frameworket skal kunne oprette document,
view objekter .
Det går ud på at kunne oprette objekter baseret på klassens tekstuelle navn.
> Når contructoren
> er protected kan man jo ikke lave objekter på stakken. Er det kun muligt
at
> lave objekter på heap'en i MFC?
>
Du mener formodentlig destructoren ?
> MFC ligner mere et nyt makrosprog end C++.
>
Enig (måske bortset fra det ikke er nyt).
> Forresten, har C++ ikke en "instanceof" som i Java?
Jo, "dynamic_cast":
class animal
{
public:
virtual ~animal(); // intended as base-class
virtual void eat() = 0;
};
class dog : public animal
{
public:
virtual void eat();
void bark();
};
void foo(animal* a)
{
dog* d = dynamic_cast<dog*>(a);
if(d) {
d->bark();
}
}
For at kunne bruge "dynamic_cast", skal typen være polymorphisk - altså
indeholde mindst een virtuel metode.
F.eks. gælder det ikke for "std::string" og "std::vector" - men de er heller
ikke beregnet til at arve fra, så man har ikke brug for "dynamic_cast".
C++ har meget begrænset funktionalitet i forhold til Java's reflektion
mekanismer.
Venlig hilsen
Mogens Hansen
| |
|
|