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

Sablona - bin. operatory – C / C++ – Fórum – Programujte.comSablona - bin. operatory – C / C++ – Fórum – Programujte.com

 

Gadael0
Návštěvník
1. 12. 2007   #1
-
0
-

Hey, dalsi vcelku zajimavej dotazek:

mam sablonu tridy, ktera muze vytvaret objekty typu napr. int nebo double. A ted si v te sablone pretizim operator+ (binarni) tak, ze vysledek vzdy ukladam do nove vytvoreneho objektu. No a jak ten operator pozna jakeho typu ma byt vysledek, kdyz scitam treba objekt int s objektem double? Takhle bez prikladu je to tezke vysvetlit, ale to bych sem musel nakopirovat tak 100 radek kodu ;-)

Nahlásit jako SPAM
IP: 193.165.2.–
Nejhorsi, co se Vam v zivote muze prihodit je, ze narazite na blbce...
Jonyzz0
Návštěvník
1. 12. 2007   #2
-
0
-

Asi nejlepší bude když sem hodíš ten svůj zdrojový kód, nebo alespoň část kódu jak by podle tebe mělo to přetížení operátoru vypadat. Z toho popisu sem to moc nepochopil.

Nahlásit jako SPAM
IP: 62.40.69.–
Gadael0
Návštěvník
1. 12. 2007   #3
-
0
-

ok, hazim sem cely kod, omlouvam se tem, kterym to vadi :) takhle jak to je, tak to jde zkompilovat, ale kdyz chci ten operator scitani pouzit v main, tak to zacne kricet prave cosi o tech ruznych typech. Jeste chci pretizit dalsi binarni operatory, takze ten problem je pro me dost klicovej. Jo, mam tam trochu bordel v tom, ze neco jsem nadefinoval hned v te sablone, neco az zvlast, ale na funkcnost to snad nema vliv.



#include <iostream>
#include <cstdlib>
using namespace std;


template <class Type, int N=2>
class Vector
{
Type * array;
int size, maxSize;

public:
Vector();
Vector(int n);
Vector(const Vector & v);
virtual ~Vector();

Type & operator [](int i);
friend ostream& operator<<(ostream& o, Vector& v) {
o << "(";
for (int i = 0; i < v.length(); i++) {
o << v[i];
if (i < v.length() - 1) o << ",";
}
o << ")"<< endl;
return o;
}

Vector & operator=(const Vector & v);
Vector & operator+(const Vector<Type, N>& v) {
if (v.size!=size) {
cerr << "error vector::operator+, can't add vectors of different size" << endl;
exit(1);
}
Vector<Type, N> temp;
for(int i=0;i<size;i++) temp.array[i]=array[i]+v.array[i];
return temp;
}
int length() const;
};

////////////////////////////////////
//----------DEFINICE----------//
////////////////////////////////////

template <class Type, int N>
Vector<Type, N>::Vector() {
maxSize=N;
array = new Type[maxSize];
for(int i=0;i<N;i++) array[i]=0;
size=N;
}

template <class Type, int N>
Vector<Type, N>::Vector(int n) {
maxSize=N;
if (N < 0) {
cerr << "error -- creating a Vector of negative capcity\n";
exit(1);
}
for(int i=0;i<N;i++) array[i]=n;
size=N;
}


template <class Type, int N>
Vector<Type, N>::Vector(const Vector & v) {
if (this == &v) {
cerr << "error -- cannot copy a vector to itself\n";
exit(1);
}
array = 0;
array = new Type[v.maxSize];
size = v.length( );
maxSize = v.maxSize;
for (int i = 0; i < v.length( ); i++) {
array[i] = v.array[i];
}
}


template <class Type, int N>
Vector<Type, N>::~Vector() {
delete [] array;
}


template <class Type, int N>
Type & Vector<Type, N>::operator [] (int i) {
if (i < 0 || i >= size) {
cerr << "error -- index out of range\n";
exit(1);
}
return array[i];
}

template <class Type, int N>
Vector<Type, N> & Vector<Type, N>::operator=(const Vector & rhs) {
if (this == &rhs) {
cerr << "error -- cannot assign a vector to itself\n";
exit(1);
}
delete [] array;
size = rhs.length( );
maxSize = rhs.maxSize;
array = new Type[maxSize];
for (int i = 0; i < size; i++)
array[i] = rhs.array[i];
return *this;
}

template <class Type, int N>
int Vector<Type, N>::length() const {
return size;
}


//////////////////////////////
//-----------MAIN-----------//
//////////////////////////////

int main(int argc, char *argv[])
{
Vector<double, 3> b;
b[0]=0.6;
b[1]=1.4;
b[2]=5.1;
cout << b;
Vector<int, 3> c;
c[0]=4.7;
c[1]=1.1;
c[2]=7.1;
cout << c;
//a ted bych tu chtel neco jako d=b+c;
system("PAUSE");
return EXIT_SUCCESS;
}

Nahlásit jako SPAM
IP: 193.165.2.–
Nejhorsi, co se Vam v zivote muze prihodit je, ze narazite na blbce...
Jonyzz0
Návštěvník
1. 12. 2007   #4
-
0
-

No buď můžeš definovat 2 metody s přetíženým oparátorem každou pro jiný typ (explicitní specializace):



Vector<int, N> operator+(const Vector<int, N>& v)
Vector<double, N> operator+(const Vector<double, N>& v)

nebo něco takového ale nevím zda to bude fungovat, neskoušel jsem:


template <typename Type2>
Vector<Type2, N> & operator+(const Vector<Type2, N>& v)

jinak nevracej tou metodou referenci na automatickou proměnnou, které končí platnost při ukončení funkce, vracej ji hodnotou.


Vector operator+(const Vector<Type, N>& v) {
if (v.size!=size) {
cerr << "error vector::operator+, can't add vectors of different size" << endl;
exit(1);
}
Vector<Type, N> temp;

for(int i=0;i<size;i++)
temp.array[i]=array[i]+v.array[i];
return temp;
}

Nahlásit jako SPAM
IP: 62.40.69.–
tmi0
Věrný člen
2. 12. 2007   #5
-
0
-

To Gadael : odkdy je operator scitani binarni? to ze mu predavas pouze jeden parametr neznamena ze je binarni, pouze to znamena ze prvni parametr je automaticky instance daneho typu ke ktere pristupujes pomoci this (pokud operator deklarujes jako clen tridy, pokud ho deklarujes jako globalniho frienda tak ma parametry 2).
zkus to pres virtualni funkce, tedy odvod si tridy pro vsechny typy ktery chces pouzivat od nejakyho abstraktniho predka, a nadefinuj jim stejnej pristup k datum. pak jen u predka pretizis operatory a je to.

EDIT by tmi: prvni odstavec tohoto prispevku je naprosty zvast, je videt ze jsem ho psal v jednu v noci, mirne opily. problem spociva v tom ze jsem si spletl slova binarni a unarni. vsem se omlouvam za svou neprekonatelnou tupost.

Nahlásit jako SPAM
IP: 89.185.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
Huge0
Návštěvník
2. 12. 2007   #6
-
0
-

Myslím, že Gadael chtěl slovem binární říci, že přijímá 2 operandy a že tedy není unární+.
Jinak myslím, že to, co tady zmínil Johnyzz by mělo fungovat.

// Takto bude vypadat hlavička té členské fce:

template <typename Type, int N> // Šablona třídy.
template <typename Type2> // Šablona funkce (specifikuje typ parametru, jeho délka musí být stejná jako u prvního parametru.
Vector<Type, N> // Navrací hodnotou Vektor podle šablony třídy.
Vector<Type, N>::operator+ // Název metody.
(const Vector<Type2, N>& druhy) { // Druhý parametr za this.
// Ještě třeba dodat, že musí existovat operator+ mezi typy Type a Type2.

Mimochodem se mi ten jeden parametr šablony (int) zdá zbytečný, na to ti přece postačí konstruktor.

Nahlásit jako SPAM
IP: 88.102.203.–
Gadael0
Návštěvník
3. 12. 2007   #7
-
0
-

To Huge : nejak se ztracim v tom, co je hlavicka ceho - jestli funkce nebo tridy.

Takze to prvni

template <typename Type, int N>
je sablona te hlavni tridy?
A kde teda potom pouziju to druhe?
template <typename Type2>
Bohuzel jsem se sablony zacal ucit asi pred tydnem, takze bych to potreboval trosku polopate (treba nejak ukazat na tom mem kodu). Zvlastni je, ze jsem tohle nejak rozumne vysvetlene nenasel v zadne z tech chytrych knih o kterych se mluvi ve vedlejsich threadech.. :(

Nahlásit jako SPAM
IP: 193.165.2.–
Nejhorsi, co se Vam v zivote muze prihodit je, ze narazite na blbce...
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, 34 hostů

Podobná vlákna

Clenske operatory — založil Alexej

Bitové operátory — založil Dotem

Násobné operátory v C — založil pirat7777

Šablona — založil Martin Heller

DEV C++ sablona — založil Anonymní uživatel

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ý