Přetížení operátoru ^ – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Přetížení operátoru ^ – C / C++ – Fórum – Programujte.comPřetížení operátoru ^ – C / C++ – Fórum – Programujte.com

 

TauWich0
Duch
29. 2. 2008   #1
-
0
-

Ahoj,
nevíte někdo, jak přetížit oerátor ^ tak, aby fungoval jako mocnina?

mám šablonu nějak takhle:
template <class T> class pole{
T* hodnota;
unsigned velikost_x,velikost_y;
public:
pole(){...};
~pole(){...};
T& operator[] (unsigned i) {return hodnota[i];}
...
...
...
}

Jak teď na tu mocninu, aby pak fungovalo:
pole<float> u;
u[i]^2;

Díky za každé vodítko

Nahlásit jako SPAM
IP: 213.194.247.–
Zelenáč0
Posthunter
29. 2. 2008   #2
-
0
-

Editoval Zelenáč: dneska ale pisu kraviny

Nahlásit jako SPAM
IP: 89.176.254.–
TauWich0
Duch
29. 2. 2008   #3
-
0
-

To Zelenáč :
T operator^ (T base, unsigned exp){return pow(base,exp);}
a kompilátor na to: too many parameters for this operator function
takže mam asi smůlu

Nahlásit jako SPAM
IP: 213.194.247.–
Jura
~ Anonymní uživatel
637 příspěvků
29. 2. 2008   #4
-
0
-



#include <iostream>
#include <cmath>

template<class T>
struct test;

// globalni verze
template<typename T>
T operator^(const test<T>& obj, size_t exp);


template<class T>
struct test
{

T m_Num;

typedef T value_type;
typedef size_t size_type;

test(const T num = T())
:m_Num(num)
{}
// nebo tridni verze - povsni si rozdilu(bere se pouze jeden parametr!!!)
/*inline value_type operator^(size_type exp)
{ return pow(m_Num, exp);
}*/


};


template<typename T>
T operator^(const test<T>& obj, size_t exp)
{
return pow(obj.m_Num, exp);
}

int main()
{
test<int> t(5);
std::cout << (t^2) << std::endl;
return 0;
}

Nahlásit jako SPAM
IP: 85.207.192.–
Jura
~ Anonymní uživatel
637 příspěvků
29. 2. 2008   #5
-
0
-



#include <iostream>
#include <cmath>

template<class T>
struct test;

// globalni verze
template<typename T>
T operator^(const test<T>& obj, size_t exp);


template<class T>
struct test
{

T m_Num;

typedef T value_type;
typedef size_t size_type;

test(const T num = T())
:m_Num(num)
{}
// nebo tridni verze - povsni si rozdilu(bere se pouze jeden parametr!!!)
/*inline value_type operator^(size_type exp)
{ return pow(m_Num, exp);
}*/


};


template<typename T>
T operator^(const test<T>& obj, size_t exp)
{
return pow(obj.m_Num, exp);
}

int main()
{
test<int> t(5);
std::cout << (t^2) << std::endl;
return 0;
}

Nahlásit jako SPAM
IP: 85.207.192.–
TauWich0
Duch
29. 2. 2008   #6
-
0
-

To Jura :
Moc díky, to je vymazlenej kus kódu. Budu se muset ještě hodně učit

Nahlásit jako SPAM
IP: 213.194.247.–
TauWich0
Duch
1. 3. 2008   #7
-
0
-

Ještě malý dotaz:
proč musí být t^2 v závorce?

std::cout << (t^2) << std::endl;

dlouho jsem se s tim mořil, ale je to tak, jinak ten operátor vrací objekt :-)). Pak taky
std::cout << (t^2+2) << std::endl;

funguje jako
std::cout << (t^4) << std::endl;


prosím trošku o objasnění (nepotřebuji řešení, takhle mi to postačuje), moc jsem toho o tomto tématu nevygoogloval.

Nahlásit jako SPAM
IP: 213.194.247.–
Jura
~ Anonymní uživatel
637 příspěvků
1. 3. 2008   #8
-
0
-

Byl to jen ilustrační přiklad použití, samozřejmě taky si to můžeš přepsat na:



...
test<int> t(2);
int iResult = t^2; // bez závorek
std::cout << iResult << std::endl;
...


Jinak to, že se ti to vyhodnocuje v jiném pořadí, než je pořadí matematický operátorů, je dáno tím, že jazyk C/C++ má nějakou prioritu operátorů. A pokud se na ni koukneš, tak zjistíš, že operátor + má vyšší prioritu než operátor ^. Bohužel(bohudík) je to dáno jazykem a nic s tím neuděláš.

Nahlásit jako SPAM
IP: 85.207.192.–
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, 2 hosté

Podobná vlákna

Přetížení — založil Marik

Přetížení [] — založil koudiss

Pretizeni [] .... — založil janek

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ý