Avatar billede tax Nybegynder
07. januar 2002 - 12:12 Der 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 :)
Avatar billede tax Nybegynder
07. januar 2002 - 12:13 #1
ITtype betyder En slags identifikations variabel
Avatar billede chries Nybegynder
07. januar 2002 - 12:15 #2
Hvis du har virtuelle funktioner, hvad skal du bruge klasse \"navnet\" til så ?
Avatar billede disky Nybegynder
07. januar 2002 - 12:18 #3
Hvad med at lade objektet selv vide hvad den er ?

Altså lige efter du har allokeret det, så fortæller du objektet hvad den selv er.
Avatar billede tax Nybegynder
07. januar 2002 - 12:18 #4
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.



Avatar billede tax Nybegynder
07. januar 2002 - 12:19 #5
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
Avatar billede jpk Nybegynder
07. januar 2002 - 12:21 #6
Fra MSDN:

To use the IsKindOf function

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.

Avatar billede tax Nybegynder
07. januar 2002 - 12:22 #7
Jeg tror blot jeg laver en variabel :)
Avatar billede chries Nybegynder
07. januar 2002 - 12:22 #8
Hvis du bruger MFC er der noget der hedder runtime class information.

Avatar billede jpk Nybegynder
07. januar 2002 - 12:23 #9
Jeg tror dog jeg ville lave en enum og så haven en member i klassen istedet...

typedef enum {TYPE_1, TYPE_2, TYPE_3} Type;

class Obj
{
Type m_Type;
};
Avatar billede disky Nybegynder
07. januar 2002 - 12:25 #10
I standard C++ er der så vidt jeg husker ikke en måde at se hvad type et objekt er.
Avatar billede tax Nybegynder
07. januar 2002 - 12:25 #11
jpk: To sjæle en tanke.
Avatar billede range Nybegynder
07. januar 2002 - 13:07 #12
Kan man ikke bare bruge

#include <typeinfo>

og derefter et sted i koden skrive eksempelvis:

cout << typeid(objekt).name();

Eller er jeg på helt galt spor !?!

/range
http://www.range.dk
Avatar billede tax Nybegynder
07. januar 2002 - 13:10 #13
Range!! Du er genial!!!!!
Avatar billede range Nybegynder
07. januar 2002 - 13:21 #14
Takker ;-)
Avatar billede soepro Nybegynder
07. januar 2002 - 16:06 #15
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester