Začátečník - "šablona" pro třídu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Začátečník - "šablona" pro třídu – C / C++ – Fórum – Programujte.comZačátečník - "šablona" pro třídu – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
liamlim0
Newbie
16. 8. 2014   #1
-
0
-

Dobrý večer,

Nedávno jsem se dočetl o spojovém seznamu a napadlo mě, že bych si něco takového mohl zkusit vytvořit. Asi jsem nevytvořil zrovna ideální řešení, ale funguje, což je pro mě hlavní.

Můj problém, napsal jsem něco takového:


typedef int T;

class trida
{
	// obsah tridy
};

Pokud "int" v horním řádku zaměním za jiné typy, pořád funguje vše správně. Ale já bych chtěl nějak zařídit, abych měl například jeden soubor .hpp pro int, druhy pro float, atd. Nechci pokaždé kopírovat celý kód a měnit jen jedno slovo, to mi přijde hloupé. Jsem opravdu docela začátečník, šablony jsem se zatím nesnažil pobrat ani u funkcí. Existuje nějaká jiná možnost jak to řešit?

Snad jde z toho, co jsem napsal pochopit, co bych rád. Za každou pomoc bych byl vděčný.

Nahlásit jako SPAM
IP: 93.99.200.–
Reklama
Reklama
p3can
~ Anonymní uživatel
312 příspěvků
16. 8. 2014   #2
-
0
-
Nahlásit jako SPAM
IP: 77.92.213.–
liamlim0
Newbie
17. 8. 2014   #3
-
0
-

#2 p3can

díky. zkusil jsem to, ale asi něco dělám špatně. Vytvořil jsem krátkou ukázku, co se mi děje. 

Pokud je vše v jednom souboru takto: 

#include <iostream>

template <typename T> 
class trida
{
public:
	trida(const T & n): data(n) {  }
	~trida() {  }
	
	const T & get(void) const {return data;}
private:
	T data;
};

int main()
{
	trida<int> objekt(7);
	std::cout << objekt.get() << std::endl;
	return 0;
}

vše funguje jak má. I pokud definici třídy napíšu do souboru .hpp a vložím. Pokud ale vytvořím 3 soubory tímto způsobem:

 

// main.cpp

#include <iostream>
#include "zkusebni.hpp"

int main()
{
	trida<int> objekt(7);
	std::cout << objekt.get() << std::endl;
	return 0;
}
// zkusebni.hpp

#ifndef ZKUS_HPP
#define ZKUS_HPP

template <typename T> 
class trida
{
public:
	trida(const T & n): data(n) {  }
	~trida() {  }
	
	const T & get(void) const;
private:
	T data;
};

#endif
// zkusebni.cpp

#include "zkusebni.hpp"

template <typename T> const T & trida<T>::get(void) const 
{
	return data;
}

Tak se mi při překladu napíše:  undefined reference to 'trida<int>::get() const'

Prosím o pomoc. Asi jsem dobře nepochopil jak se šablony používají nebo kde je problém.

Nahlásit jako SPAM
IP: 93.99.200.–
KIIV+42
God of flame
17. 8. 2014   #4
-
0
-

aby ti to fungovalo, tak musis mit templatovy funkce a metody taky inlcudovany a nebo predem pripravit obvykly typy (v realu je to beztak kombinace templaty v header file a predkompilovany nejobvyklejsi instantizace)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
liamlim0
Newbie
17. 8. 2014   #5
-
0
-

#4 KIIV

Díky za odpověď. "templatovy metody" - v mém vidím jen get() - mám mít includovaný - kde? v main.cpp ?

Přijde mi divné do main.cpp napsat #include "zkusebni.cpp"   protože kdybych to udělal do více souborů tak bych měl více definicí get() což asi být nemůže.

Nahlásit jako SPAM
IP: 93.99.200.–
KIIV+42
God of flame
17. 8. 2014   #6
-
0
-

#5 liamlim
u sablon zadnou instanci nemas, dokud ji nepouzijes - u nas se treba pouzivalo .h jako header file, .inc jako sablony (vlozilo se do header file) - ale zalezi na tobe..

mozna se to ani nepomlati jak to byva i u objektu (ale to by sis musel asi overit)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
liamlim0
Newbie
17. 8. 2014   #7
-
0
-

#6 KIIV

Díky. Asi už to chápu. Snad. Když napíšu 
 

template <typename T> void trida<T>::funkce(void)
{
	return;
}

do souboru trida.hpp  a tento vložím do více souborů tak nebude žádná vícenásobná definice a tedy error? Snad to chápu dobře. Ještě zkusím něco rychle naprogramovat abych si to ověřil.

Nahlásit jako SPAM
IP: 93.99.200.–
Řešení
KIIV+42
God of flame
17. 8. 2014   #8
-
0
-
Vyřešeno Nejlepší odpověď

u template urcite ne a tusim ze ani se mi snad nestalo u trid, pokud to mas primo uvnitr deklarace tridy (kdyz je to mimo ni tak uz to vadi - ale ne u template)

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
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, 94 hostů

Moderátoři diskuze

 

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