Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Abbiamo provato per molti giorni il nuovo Z Fold7 di Samsung, un prodotto davvero interessante e costruito nei minimi dettagli. Rispetto al predecessore, cambiano parecchie cose, facendo un salto generazionale importante. Sarà lui il pieghevole di riferimento? Ecco la nostra recensione completa.
The Edge of Fate è Destiny 2.5. E questo è un problema
The Edge of Fate è Destiny 2.5. E questo è un problema
Bungie riesce a costruire una delle campagne più coinvolgenti della serie e introduce cambiamenti profondi al sistema di gioco, tra nuove stat e tier dell’equipaggiamento. Ma con risorse limitate e scelte discutibili, il vero salto evolutivo resta solo un’occasione mancata
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
AMD ha aggiornato l'offerta di CPU HEDT con i Ryzen Threadripper 9000 basati su architettura Zen 5. In questo articolo vediamo come si comportano i modelli con 64 e 32 core 9980X e 9970X. Venduti allo stesso prezzo dei predecessori e compatibili con il medesimo socket, le nuove proposte si candidano a essere ottimi compagni per chi è in cerca di potenza dei calcolo e tante linee PCI Express per workstation grafiche e destinate all'AI.
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


Recensione Samsung Galaxy Z Fold7: un grande salto generazionale Recensione Samsung Galaxy Z Fold7: un grande sal...
The Edge of Fate è Destiny 2.5. E questo è un problema The Edge of Fate è Destiny 2.5. E questo ...
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello Ryzen Threadripper 9980X e 9970X alla prova: AMD...
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale Acer TravelMate P4 14: tanta sostanza per l'uten...
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque Hisense M2 Pro: dove lo metti, sta. Mini proiett...
Identikit della scheda video perfetta, p...
SUV, 100% elettrico e costa meno di un b...
Hai mai caricato un referto su ChatGPT? ...
Apple vuole un nuovo campus nella Silico...
DJI Osmo 360, la nuova action cam a 360&...
Lo strumento anti-requisiti per Windows ...
Utenti di Claude in rivolta: 'I bei vecc...
Rocket Lab Mars Telecommunications Orbit...
NVIDIA GeForce RTX: supporto driver su W...
iliad ha iniziato a vendere smartphone d...
La cinese SatNet ha lanciato un nuovo gr...
Cloud sovrano europeo: a che punto siamo...
The Medium arriverà al cinema gra...
Addio alle faccende domestiche? Il robot...
Fallito il primo lancio del razzo spazia...
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: 01:26.


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