Ako spravit kopiu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ako spravit kopiu – C / C++ – Fórum – Programujte.comAko spravit kopiu – C / C++ – Fórum – Programujte.com

 

Grungy0
Super člen
23. 4. 2010   #1
-
0
-

Ahojte zas riešim jeden zapeklitý problém, z ktorého neviem vykorčulovať a bol by som rád ak by sa našiel niekto kto by mi vedel pomôcť, alebo aspoň nasmerovať.

Mám triedu Base, a jej potomkov Dyn_obj a Stat_obj, ktoré majú tú istú virtuálnu metódu Draw() a
kontajner ktorý obsahuje smerníky na Base. Do neho samozrejme vkladám raz objekty typu Dyn_obj a inokedy Stat_obj.
Keď na každý jeho prvok zavolám Draw() tak sa to vykreslí správne. Problém, je však vtedy ak sa snažím spraviť kópiu tohoto kontajneru pomocou metódy Copy(). Ak ju dám potom vypísať tak sa všetky objekty kópie tvária ako typu Base. Prikladám kus kodu

Copy(Kontajner *kopia_kontajneru)

for(int i=0; i<100; i++)
{
if(kontajner->prvok(i) !=NULL)
{
Base* pom= Base(*kontajner->prvok(i));

Dyn_obj *pom_do = dynamic_cast<Dyn_obj *> (pom);
if(pom_do!=NULL)
{
pom_do= new Dyn_obj(* dynamic_cast<Dyn_obj *> (kontajner->prvok(i));
kopia_kontajneru->pridaj(pom_do); //ako parameter ma smernik na Base
}
}
}

Nahlásit jako SPAM
IP: 188.123.100.–
Prvý náznak hlúposti, je pocit geniality.
liborb
~ Redaktor
+18
Guru
23. 4. 2010   #2
-
0
-

Můžeš si vytvořít virtuální funkci Clone, která bude v dané třídě vytvářet novou instanci této třídy a pohodlně kopírovat hodnoty atributů, když už je to ta kopie.

Nahlásit jako SPAM
IP: 91.203.96.–
vdolek0
Newbie
23. 4. 2010   #3
-
0
-

Hele, nejsem si jist, jestli to dobře chápu. Kontajner obsahuje ukazatele na Base, ale ukládáš do nich ukazatele na třídy Dyn_onj a Stat_obj a tato metoda má zkopírovat tento kontejner.

Base* pom= Base(*kontajner->prvok(i));

Dyn_obj *pom_do = dynamic_cast<Dyn_obj *> (pom);

Tyto dva řádky mi přidou nesmyslné, za prvé přiřazuješ objekt Base do ukazatele (asi ti tam chybí new) a za druhé když už máš v proměnné pom ukazatel na nový objekt Base, nemá cenu se ho snažit přetypovávat na potomka (protože ta je prostě objekt Base, jak jsi ho tam přířadil, a ne jeho potomek).
Pokud potřebuješ udělat kopii objektu, na který ukazuje ukazatel a nevíš, jestli ukazuje na potomka, tak si ve třídě Base udělej virtuální metodu copy, kterou překryješ v potomcích (tato metoda bude vytvářet kopii svého objektu). V metodě copy bys pak volal metody copy danných potomků Base, které by vytvářeli skutečné kopie objektů.
Nebo pokud bys to nechtěl takhle komplikovat, mohl bys danné dva řádky nahradit něčím takovým:
Base* pom = dynamic_cast<Dyn_obj *> (*kontajner->prvok(i));


if (pom != NULL)
pom = new Dyn_obj(*kontajner->prvok(i));
else
pom = new Base(*kontajner->prvok(i));

Pokud bys ale chtěl ošetřovat ještě možnosti, že ukazatel ukazuje i na jiné potomky (třeba Stat_obj), musel bys vždy upravit tuto metodu.

Nahlásit jako SPAM
IP: 84.42.206.–
Grungy0
Super člen
23. 4. 2010   #4
-
0
-

Aha ďakujem to s tou metódou Clone je veľmi dobrý nápad. Áno používam tam zbytočnosti, to bude asi tým, že nad tým sedím už strašne dlho.

Nahlásit jako SPAM
IP: 188.123.100.–
Prvý náznak hlúposti, je pocit geniality.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 33 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý