Templates - implementace funkcionality – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Templates - implementace funkcionality – C / C++ – Fórum – Programujte.comTemplates - implementace funkcionality – C / C++ – Fórum – Programujte.com

 

Petr
~ Anonymní uživatel
746 příspěvků
8. 6. 2010   #1
-
0
-

Ahoj,
řeším školní úlohu v C++ a bohužel se mi nedaří přijít na nějaký inteligentní nápad řešení, google také pod mými dotazy mlčí.

Zadání je: Naimplementujte vlastní šablonu ve stylu STL (např. vector), ale nepoužívejte přitom příkaz template.

Zkusil jsem na to jít cestou třídy "vektor" s virtuální funkcí push_back, od ní podědit příslušnou třídu pro vybrané typy - integer, char, atd. napr. class vektor_char : public vektor, vektor_int:public vektor. V kazde z nich pak pretizit operator [] vzdy pro prislusny datovy typ. Nicmene s timto resenim jsem neuspel - STL pracuje univerzalne a nemusis premyslet, kterou tridu pouzit.

Dokazete prosim nekdo poradit? Je nejaka moznost napr. na datovy kontejner, aniz bych pouzil STL?

Dekuju,
Petr

Nahlásit jako SPAM
IP: 94.113.9.–
Jura
~ Anonymní uživatel
637 příspěvků
8. 6. 2010   #2
-
0
-

Zdravím,

opravdu to zadání znělo:

Naimplementujte vlastní šablonu ve stylu STL (např. vector), ale nepoužívejte přitom příkaz template.



Totiž nějak si to protiřečí. Jak máš vytvořit _šablonu_ bez použití klíčového slova template?
Pokud to opravdu znělo takto, tak to už samo o sobě něco vypovída o kvalitě učitele.

Nahlásit jako SPAM
IP: 85.207.192.–
Quiark0
Věrný člen
8. 6. 2010   #3
-
0
-

Taky mi to přijde jako kravina.

Nahlásit jako SPAM
IP: 89.103.91.–
liborb
~ Redaktor
+18
Guru
9. 6. 2010   #4
-
0
-

A není to úloha "jenom" na přetěžování funkcí ... možná tím chtěl demonstrovat sílu šablon :smile1: .

Nahlásit jako SPAM
IP: 85.207.166.–
Linnest
~ Anonymní uživatel
1 příspěvek
9. 6. 2010   #5
-
0
-

Jestli tím nechtěl říct abys neuříval dědičnost ze stávajících šablon, jako že nemyslel příkaz template ale jakýkoliv stávající šablony, abys je nemohl jen rozšiřovat.
Lze udělat objekt, který se bude chovat jako šablona s princily STL bez použití klíčového slova template, ale to prostě není šablona jen objekt se stejným chováním.

Nahlásit jako SPAM
IP: 194.228.18.–
Petr
~ Anonymní uživatel
746 příspěvků
9. 6. 2010   #6
-
0
-

To Linnest : Ono to zadání jsem trochu zkrátil, ta "šablona" byla zavádějící, myšlena byla funkcionalita šablony. Pokud by byla možnost použít "template", tak se to dá naimplementovat docela snadno. Ale mám obavy, že to není tento případ. Mě spíš šlo o to, jestli nejde nějakou "fintou" dosáhnout toho, abych mohl pracovat s generickými parametry, aniž bych používal klíčové slovo template. Např. struktura bude mít ve vstupních parametrech typ int, přičemž adekvátně si podle toho nastavím všechny proměnné v rámci této struktury.

Děkuju všem za postřehy! Tenhle příklad je bezpochyby v praxi k ničemu a má ilustrovat, že jsem pochopil sílu šablon a vím co nahrazují :o)

Nahlásit jako SPAM
IP: 94.113.9.–
ian0
Stálý člen
9. 6. 2010   #7
-
0
-

To Petr : Napadá mě několik způsobů, jak tuhle divou úlohu řešit.
První. Můžeš to celé naprogramovat v preprocesorových makrech, jako jeden z parametrů předáš i typ a ten pak v těle makra nahradíš u příslušných deklarací proměnných a návratových hodnot.

Druhý. Napíšeš normální třídu pro kontejner, akorát místo specifickýho typu dat budeš používat pointer na void, v konstruktoru si pak předáš velikost toho typu, tak si buděš moct alokovat paměť, aniž bys znal přesný typ. Dokonce nad tím snadno půjde vyrobit i iterátor. A kdybys chtěl mít nad daty nějaké uspořádání, tak požádáš uživatele o pointer na funkci (v c++ aka funktor), která to uspořádání implementuje. Nevýhoda tohoto řešení je, že budeš muset všechny data z kontejneru přetypovávát zpět na správný typ.

... a nebo můžeš použít kombinaci obou, tedy třídu s void* a nějaká proxy makra, která provedou type casting za tebe.

Moje poznámka: tohle je sice krásná úloha jak řešit šablony v pure C, do C++ ale tyhle postupy prostě nepatří. Programátoři by se měli vyvarovat míchání přístupů obou jazyků, byť dle normy je C syntakticky (skoro) podmnožinou C++.

Nahlásit jako SPAM
IP: 89.24.135.–
-- ian
Petr
~ Anonymní uživatel
746 příspěvků
9. 6. 2010   #8
-
0
-

To ian : Druhé řešení mi dává hodně velký smysl, zkusím si s tím trochu pohrát. Tahle možnost mě nenapadla ani se mi to nepodařilo najít. Děkuju moc za radu!!!

Jestli budu mít chvíli, zkusím zagooglit i na ty preprocesorová makra, nicméně abych řekl pravdu, aktuálně je to pro mě naprosto neznámé území.

Nahlásit jako SPAM
IP: 94.113.9.–
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, 8 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ý