/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
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





Søg
Reklame
Statistik
Spørgsmål : 177496
Tips : 31968
Nyheder : 719565
Indlæg : 6408491
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste