Posted By: medvidek (Zase za polarnim kruhem) on 'CZprogram'
Title:     C++ - jak se zbavit pretypovani
Date:      Mon Oct  8 13:25:24 2001

   Zdravim vsechny C++kare.

   Mam tridu, ktera ma slouzit jako uzel stromu. Potrebuju, aby kazdy uzel 
stromu mel urcite vlastnosti -> vytvorim predka, od ktereho musi kazdy realny 
uzel stromu podedit. 

Predek muze hodne zjednodusene vypadat treba takto:

class Base {
public:
  Base* parent; // ukazatel na rodice
  // definice spolecnych vlastnosti pro vsechny uzly
}

Potom nejaky realny uzel muze vypadat treba takto:

class Node : public Base {
  int data; // nejaka data
  int f();  // nejaka nove pridana funkce
}

udelam instanci a zavolam funkci f():
Node n;
n.f();

to jde bez problemu, ale uz nezavolam funkci f() pro rodice :(

n.parent->f();

Musel bych volat:

((Node*)(n.parent))->f();

Mozna by slo usetrit nejake zavorky a lepsi je asi pouzivat dynamic_cast, ale 
to neni podstatne. Ja se chci zbavit toho pretypovani, protoze potrebuju 
funkce rodice a sourozencu volat casto.

Co s tim? 

Vymyslel jsem jedno reseni, ale je takove drsne... chtel bych neco lepsiho. To 
moje asi neni moc kompatibilni. Zde je to reseni.

template <class T> class Base {
public:
  T* parent; // ukazatel na rodice
  // definice spolecnych vlastnosti pro vsechny uzly
}

class Node : public Base<Node> {
  int data; // nejaka data
  int f();  // nejaka nove pridana funkce
}

Ted muzu klidne zavolat n.parent->f();


                 medvidek

--
         ELVIRA - Extended LSD VoiceXML interpreter for Applications
                       http://www.fi.muni.cz/lsd/elvira
  Engine for building dialog applications        Free for noncommercial use

Search the boards