Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più
Dreame X60 Pro Ultra Complete implementa due bracci estensibili, per spazzola e moccio, che si spingono ben oltre quanto visto sino ad oggi permettendo una pulizia di casa ancor più capillare e precisa
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
La tecnologia SQD-Mini LED di TCL arriva sul taglio da 65 pollici con la serie C8L: 2040 zone, pannello WHVA 2.0 e un picco che alle rilevazioni delle sonde tocca i 4400 nit nel profilo Filmmaker e un HDR quasi perfetto
MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro
MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro
Wireless 2.4 GHz, Bluetooth 5.4, cancellazione attiva del rumore, design pieghevole e un'autonomia che mette in imbarazzo prodotti che costano il doppio. Le Maestro 500 non eccellono in nulla, ma offrono tutto. E a questo prezzo è difficile chiedere di più
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-10-2007, 18:19   #1
ndakota
Senior Member
 
L'Avatar di ndakota
 
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
[c++] funzioni friend e ridefinizione degli operatori

salve, sto facendo una classe che permette di usare oggetti frazione come tipi primitivi ma non capisco perchè se ridefinisco < così:

Codice:
friend bool operator < (frazione a, frazione b);

bool operator < (frazione a, frazione b)
{
   if ( (a._num * b._den) < (b._num * a._den) )
      return true;

   else 
      return false;
}
perchè allora non posso fare il > così??

Codice:
bool operator > (frazione a, frazione b);

bool frazione::operator > (frazione a, frazione b)
{
   return !(a<b);
}
perchè? perchè? < è già ridefinito.. invece riesco solo se faccio anche > friend implementato nello stesso modo del <.. uff.. grazie a tutti..
ndakota è offline   Rispondi citando il messaggio o parte di esso
Old 13-10-2007, 18:49   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Perché è errato come l'hai scritto:
Codice:
bool frazione::operator > (frazione b)
{
   return !(*this < b);  
}
In ogni caso è anche concettualmente sbagliato così, in quanto l'implementazione è quella del >= e non quella del maggiore. Infatti !(a<b) equivale a a>=b
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 13-10-2007, 18:55   #3
ndakota
Senior Member
 
L'Avatar di ndakota
 
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
accidenti grazie.. la cosa del ! non l'avrei mai immaginata.. in ogni caso non mi è chiarissimo l'uso del *this sebbene sappia cos'è..
ndakota è offline   Rispondi citando il messaggio o parte di esso
Old 13-10-2007, 18:58   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
this è il puntatore all'oggetto corrente...giusto ?
*this cosa sarà ? Ovviamente l'oggetto corrente

Quindi se scrivi *this < b, passi all'operatore friend < come primo parametro l'oggetto corrente e come secondo b
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 13-10-2007, 19:12   #5
ndakota
Senior Member
 
L'Avatar di ndakota
 
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
Quote:
Originariamente inviato da cionci Guarda i messaggi
this è il puntatore all'oggetto corrente...giusto ?
*this cosa sarà ? Ovviamente l'oggetto corrente

Quindi se scrivi *this < b, passi all'operatore friend < come primo parametro l'oggetto corrente e come secondo b
ok ma questo 'oggetto corrente' sarebbe?

Codice:
int main()
{
   frazione a(4, 1), b(2, 1);

   bool x = a>b;
   
   return 0;
}
nella fattispecie il nostra a o che altro?
ndakota è offline   Rispondi citando il messaggio o parte di esso
Old 14-10-2007, 01:28   #6
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
a...cioè l'istanza della classe di cui chiami l'operatore >.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 14-10-2007, 10:12   #7
ndakota
Senior Member
 
L'Avatar di ndakota
 
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
ecco il .h

Spoiler:

Codice:
#ifndef FRAZIONE_H
#define FRAZIONE_H

class frazione
{
	friend frazione operator + (frazione a, frazione b);
	friend frazione operator - (frazione a, frazione b);
	friend frazione operator * (frazione a, frazione b);
	friend frazione operator / (frazione a, frazione b);
	friend bool operator < (frazione a, frazione b);
	friend bool operator > (frazione a, frazione b);
	friend bool operator != (frazione a, frazione b);
public:
	frazione operator += (frazione a);
	frazione operator -= (frazione a);
	frazione operator *= (frazione a);
	frazione operator /= (frazione a);
	bool operator == (frazione a);
	bool operator <= (frazione a);
	bool operator >= (frazione a);
	frazione(void);
	frazione(int a, int b);
	void visualizza();
	void visualizza_s();
private:
	void semplifica();
	int _num, _den;
};

#endif


e il .cpp

Spoiler:

Codice:
#include "frazione.h"
#include <iostream>
using namespace std;

frazione operator + (frazione a, frazione b)
{
	frazione c;
	c._num = a._num * b._den + a._den * b._num;
	c._den = a._den * b._den;
	return c;
}

frazione operator - (frazione a, frazione b)
{
	frazione c;
	c._num = a._num * b._den - a._den * b._num;
	c._den = a._den * b._den;
	return c;
}

frazione operator * (frazione a, frazione b)
{
	frazione c;
	c._num = a._num * b._num;
	c._den = a._den * b._den;
	return c;
}

frazione operator / (frazione a, frazione b)
{
	frazione c;
	c._num = a._num * b._den;
	c._den = a._den * b._num;
	return c;
}

bool operator < (frazione a, frazione b)
{
	if ( (a._num * b._den) < (b._num * a._den) )
		return true;

	else
		return false;
}

bool operator > (frazione a, frazione b)
{
	if ( (a._num * b._den) > (b._num * a._den) )
		return true;

	else
		return false;
}

bool operator != (frazione a, frazione b)
{
	return !(a == b);
}

frazione frazione::operator += (frazione a)
{
	(*this) = (*this) + a;
	return *this;
}

frazione frazione::operator -= (frazione a)
{
	(*this) = (*this) - a;
	return *this;
}

frazione frazione::operator *= (frazione a)
{
	(*this) = (*this) * a;
	return *this;
}

frazione frazione::operator /= (frazione a)
{
	(*this) = (*this) / a;
	return *this;
}

bool frazione::operator == (frazione a)
{
	semplifica();
	a.semplifica();

	if ( (this->_num == a._num) && (a._den == this->_den) )
		return true;

	else
		return false;
}

bool frazione::operator >= (frazione a)
{
	return  !(*this < a);
}

bool frazione::operator <= (frazione a)
{
	return  !(*this > a);
}

frazione::frazione(void)
{

}

frazione::frazione(int a, int b)
{
	_num = a;
	_den = b;
}

void frazione::visualizza_s()
{
	semplifica();

	if (_den == 1)
		cout<<_num<<endl;

	else 
		cout << _num << " / " << _den << endl;
}

void frazione::visualizza()
{
	if (_den == 1)
		cout<<_num<<endl;

	else 
		cout << _num << " / " << _den << endl;
}

void frazione::semplifica()
{
	int num = _den;

	for (int i = num; i > 1; i--)
		
		if ( (_num%i == 0) && (_den%i == 0) )
		{
			_num /= i;
			_den /= i;
		}
}


come ti sembra? si può migliorare? se si, come? dovrei aggiungerci qualcosa? grazie
ndakota è offline   Rispondi citando il messaggio o parte di esso
Old 14-10-2007, 11:25   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
class frazione
{
friend frazione operator + (const frazione a, const frazione b);
friend frazione operator - (const frazione a, const frazione b);
friend frazione operator * (const frazione a, const frazione b);
friend frazione operator / (const frazione a, const frazione b);
friend bool operator < (const frazione a, const frazione b);
friend bool operator > (const frazione a, const frazione b);
friend bool operator != (const frazione a, const frazione b);
public:
frazione &operator += (const frazione a);
frazione &operator -= (const frazione a);
frazione &operator *= (const frazione a);
frazione &operator /= (const frazione a);
bool operator == (const frazione a);
bool operator <= (const frazione a);
bool operator >= (const frazione a);
frazione(void);
frazione(int a, int b);
void visualizza();
void visualizza_s();
private:
void semplifica();
int _num, _den;
};
Il const mi sembra banale...nel senso che altrimenti non puoi passare variabili const agli operatori

Gli operatiro che fanno un'assegnazione devono sempre ritornare un reference all'oggetto stesso. Se non usi & ritorni una copa dell'oggetto non puoi ad esempio fare:

(a += b) += c;

in quanto a += b ritornerà un copia dell'oggetto a (tramite il costruttore di copia), ma non l'oggetto a stesso. Quindi andrai a richiamare += c su un oggetto temporaneo che verrà automaticamente liberato alla fine del blocco.
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più Dreame X60 Pro Ultra Complete: i bracci si esten...
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati TCL 65C8L, la recensione del SQD-Mini LED da 440...
MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro MSI Maestro 500 Wireless: ANC e 90 ore di autono...
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine NL-LC1 è il primo dissipatore a liquido A...
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con ...
NVIDIA mostra una comunità di rob...
Sony annuncia LYTIA L910, arriva il sens...
Ericsson, il 5G è l’infrastruttur...
Marvell punta tutto su TSMC A14: sar&agr...
Hyundai a un passo dal controllo totale ...
Questo SSD vecchio 16 anni ha resistito ...
Monopattino elettrico Xiaomi in offerta:...
Microsoft usa le capre di Age of Empires...
Microsoft conferma bug nel Cestino in tu...
Accenture crolla del 20% in borsa, il pe...
ASUS Pro WS W890E-SAGE SE: sette PCIe 5....
Attenzione al prezzo di questa TV Hisens...
Chrome sbeffeggiato da Ballmer nel 2009:...
Un gioco Mac compatibile con Apple Silic...
La batteria allo stato solido di Honda s...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:03.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v