07. januar 2002 - 12:12Der er
14 kommentarer og 1 løsning
Identifikation af klasse?
Jeg laver en form for modellering af noget flow i rør. Til dette har jeg lavet et sæt klasser til at repræsentere de forskellige dele der eksisterer i netværket. Disse har jeg alle ladet nedarve fra en slags moderklasse, så kan jeg behandle alle objekterne som en enstans af moderklassen. Jeg implementerer derefter objekternes særheder igennem virtuelle funktioner som implementeres forskelligt i alle klasserne.
Mit spørgsmål er som følger:
Hvis jeg har en pointer (Moderklasse*) til et vilkårligt nedarvet objekt. Hvordan finder jeg så ud af hvilken type objekt jeg har fat i? Skal jeg selv lave en ITtype variabel ved constructoren eller er der en slags klasse identifikations scheme i c++??
Jeg har desværre været lidt sløset med mine points. For mange spørgsmål. Jeg skal aflevere eksamensprojekt 31 jan :)
Jeg stiller modellen af systemet til rådighed igennem moderklassen. Så dem der skal bruge modellen skal udefra kunne styre modellen. Jeg havde tænkt mig noget i stil med.
for (hvert objekt i netværket) Hvis der er tale om en pumpe Pump en smule
Det kan selvfølgelig laves i virtuelle kald, men nogle af mine funktioner anvendes kun i nogle af objekterne og vil derfor give en masse tomme implementeringer i de andre klasser.
Disky. det har jeg gjort før, jeg var bare interesseret i at vide om c++ har en slags klasse fingeraftryk i stil med et MD5 aftryk man kunne identificere klassen på under runtime
Make sure the class has run-time class support. That is, the class must have been derived directly or indirectly from CObject and used the DECLARE_DYNAMIC and IMPLEMENT_DYNAMIC, the DECLARE_DYNCREATE and IMPLEMENT_DYNCREATE, or the DECLARE_SERIAL and IMPLEMENT_SERIAL macros explained in the article CObject Class: Deriving a Class from CObject.
Call the IsKindOf member function for objects of that class, using the RUNTIME_CLASS macro to generate the CRuntimeClass argument, as shown here: // in .H file class CPerson : public CObject { DECLARE_DYNAMIC( CPerson ) public: CPerson(){};
// other declaration };
// in .CPP file IMPLEMENT_DYNAMIC( CPerson, CObject )
void SomeFunction(void) { CObject* pMyObject = new CPerson;
if(pMyObject->IsKindOf( RUNTIME_CLASS( CPerson ) ) ) { //if IsKindOf is true, then cast is all right CPerson* pmyPerson = (CPerson*) pMyObject ; ... delete pmyPerson; } ... delete [MyObject]; }
Note IsKindOf returns TRUE if the object is a member of the specified class or of a class derived from the specified class. IsKindOf does not support multiple inheritance or virtual base classes, although you can use multiple inheritance for your derived Microsoft Foundation classes if necessary.
Normalt laver man en virtual function i moderklassen, som skal implementeres i alle de nedarvede klasser. Denne funktion IsClass f.eks. returnere så simpelthen blot navnet på sig selv. Du kan da i din funktion benytte en hvilket som helst pointer fra en nedarvet klasse og kalde IsClass funktionen, for at få det faktiske klasse navn.
I øvrigt findes IsClass og ClassName funktionerne indbygget i VCL-klasserne i C++ Builder.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.