.[ ČeskéHry.cz ].
Dědičnost, polymorfismus a tak

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Solid.Sn



Založen: 08. 08. 2009
Příspěvky: 55

PříspěvekZaslal: 29. březen 2011, 14:02:13    Předmět: Dědičnost, polymorfismus a tak Odpovědět s citátem

Ahoj, potřeboval bych navrhnout něco na principu následujícího vzoru, ale nedaří se mi to vyřešit.

Ve větším je to seznam určitých elementů, které všechny pocházejí z jednoho předka (proto je i v tomto příkladě deklarováno pole prvků typu A, což je korektní i pro instance tříd, které dědí z A) , ale mají doimplementované nějaké další metody (zde jsem pouze přidal pro příklad veřejné proměnné).

Jelikož vím, jaký prvek zpracovávám, tak bych potřeboval mít možnost zavolat pomocí typu A i metody, případně dostat se k proměnným objektu třídy B (či jiné, která dědí z A a tedy může být v poli tohoto typu).

Musí se vždy přetypovat s tím, že budu pracovat s ukazateli, nebo se to dá řešit jinak?

Díky

kód:
class A
{
   public:
      int a;
};
class B: public A
{
   public:
      int b;
};
class C: public A
{
   public:
      int c;
};
int main()
{
   A arr[ 3 ] = { A(), B(), C() };
   arr[ 0 ].a = 1;
   arr[ 1 ].a = 1;
   arr[ 2 ].a = 1;
   arr[ 1 ].b = 1; // nejde
   arr[ 2 ].c = 2; // nejde
   return 0;
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
raulis



Založen: 01. 08. 2007
Příspěvky: 7
Bydliště: Jičín

PříspěvekZaslal: 29. březen 2011, 15:54:57    Předmět: Odpovědět s citátem

Pokud se nepletu, mel bys pouzit dynamic_cast pro pretypovani na potomka.
napr.:
kód:
dynamic_cast<B*>(&arr [1] )->b = 1;

_________________
Za to málo, co znám, vděčím své hlouposti.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 29. březen 2011, 18:38:21    Předmět: Odpovědět s citátem

Tohle je úplně blbě. Když uděláš statické pole tříd A, tak toto pole bude mít velikost = velikost A *počet prvků. Pokud bude B mít v sobě dalších 100 bajtů dat, tak v tom poli tato data prostě nebudou, protože je to pole Aček.

Musíš pracovat s poli ukazatelů a elementy alokovat dynamicky.
_________________
Mám strach
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 29. březen 2011, 20:58:32    Předmět: Odpovědět s citátem

A co je teda špatně na:
kód:
class A
{
   public:
      int a;
      union
      {
         ing b;
         int c;
      };
};

? Nebo jinak, proč to neděláš takhle?

EDIT: přídán union
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 30. březen 2011, 08:07:09    Předmět: Odpovědět s citátem

Podobně, co píše raulis, ale musíš mít pole ukazatelů.

raulis napsal:
Pokud se nepletu, mel bys pouzit dynamic_cast pro pretypovani na potomka.
napr.:
kód:
dynamic_cast<B*>(&arr [1] )->b = 1;


tedy podle mě:
kód:

A* arr[ 3 ];
arr[0] = new A();
arr[1] = new B();
arr[2] = new C();
dynamic_cast<B*>(arr [1] )->b = 1;

_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 30. březen 2011, 10:42:21    Předmět: Odpovědět s citátem

pozor na ten dynamic_cast. moze vratit NULL a je tam segfault.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Solid.Sn



Založen: 08. 08. 2009
Příspěvky: 55

PříspěvekZaslal: 30. březen 2011, 11:17:32    Předmět: Odpovědět s citátem

Díky, předpokládal jsem, že to takhle bude.

Ten příklad s tím statickým polem byl blbě (samozřejmě to tak nepoužívám), jen jsem to chtel zjednodušit a to nevyšlo. Confused
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Solid.Sn



Založen: 08. 08. 2009
Příspěvky: 55

PříspěvekZaslal: 30. březen 2011, 19:56:54    Předmět: Odpovědět s citátem

Ještě bych se chtěl zeptat na něco. Chtěl bych prostě docílit toho, jako je document.getElementById( "id" ) v JavaScriptu a tato funkce by mi vracela odkazy na elementy (jako v JS například select, div, textarea, ...) což budou instance tříd, které všechny dědily z nějaké hlavní nadtřídy. A tyto prvky by měly být v seznamu, který je právě bude vracet.

Prostě aby mi přímo funkce vracela určitý typ... jen mě nenapadá, jak napsat šablonu, pokud to takhle vůbec jde vyřešit.

Děkuji
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 30. březen 2011, 20:04:00    Předmět: Odpovědět s citátem

Ta funkce ti vrátí BaseClass * anebo BaseClass &. Nemůže vrátit konkrétní odvozený typ, leda že bys měl pro každý typ jednu takovou funkci:
kód:

Subclass1 *Get1(id)
Subclass2 *Get2(id)
Subclass3 *Get3(id)
...

a volající kód samozřejmě musí vědět, jaký typ čeká a příslušnou funkci zavolat. Ty funkce se od sebe budou lišit akorát parametrem ve static_cast<T>(nalezeny_objekt), takže je můžeš zešablonovat všechny do jednoho kusu kódu:

kód:

template<T> T* Get(id) {
 return static_cast<T*>(BaseGet(id));
}

_________________
Mám strach
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna