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
|
Zaslal: 29. březen 2011, 14:02:13 Předmět: Dědičnost, polymorfismus a tak |
|
|
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 |
|
 |
raulis
Založen: 01. 08. 2007 Příspěvky: 7 Bydliště: Jičín
|
Zaslal: 29. březen 2011, 15:54:57 Předmět: |
|
|
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 |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 29. březen 2011, 18:38:21 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 29. březen 2011, 20:58:32 Předmět: |
|
|
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 |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 30. březen 2011, 08:07:09 Předmět: |
|
|
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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 30. březen 2011, 10:42:21 Předmět: |
|
|
pozor na ten dynamic_cast. moze vratit NULL a je tam segfault. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
Solid.Sn
Založen: 08. 08. 2009 Příspěvky: 55
|
Zaslal: 30. březen 2011, 11:17:32 Předmět: |
|
|
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.  |
|
Návrat nahoru |
|
 |
Solid.Sn
Založen: 08. 08. 2009 Příspěvky: 55
|
Zaslal: 30. březen 2011, 19:56:54 Předmět: |
|
|
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 |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 30. březen 2011, 20:04:00 Předmět: |
|
|
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 |
|
 |
|