PDA

View Full Version : [PILLOLA]Proprietà in C++


Luc@s
26-01-2004, 14:04
Ecco come ottenere una proprietà di un oggetto ( cioè un set/get su di esso) con un unica funzione:

#include <iostream>

using std::cin;
using std::cout;

class Prova
{
private:
int n;
public:
Prova()
{
n = 0;
};
~Prova()
{
};
inline int& N()
{
return n;
}
inline void print()
{
cout << n << std::endl;
}
};

int main(int argc, char * argv[])
{
Prova* p = new Prova();
p->print();
p->N() = 19; // set
p->print();
p->N() = 30; // set
p->print();
int nn = p->N(); //get
cout << nn << std::endl;
delete p;
cin.get();
return 0;
}




ciauz

ilsensine
26-01-2004, 14:28
Sono queste le bellezze del c++ che non capirò mai; se hai bisogno di una simile funzione N(), perché non dichiarare direttamente "n" come pubblico? :D

Luc@s
26-01-2004, 14:30
se volessi controllare l'input da inserire?
E cmq questo java nn lo ha e C#( bleah) lo implementa con 2 costrutti(get, set)

E poi fa figo :=)

ilsensine
26-01-2004, 14:51
Originariamente inviato da Luc@s
se volessi controllare l'input da inserire?

Mi fai vedere come fai, con una _simile_ funzione, ad avere qualsivoglia controllo sui valori da passare a n? :D

cionci
26-01-2004, 14:54
Originariamente inviato da ilsensine
perché non dichiarare direttamente "n" come pubblico? :D
IMHO per amentare l'astrazione...

Mettiamo che un aggiornamento dell'oggetto rinomini la variabile interna da n a num...
Mettendo n pubblica tutte i sorgenti che utilizzano n dovranno essere cambiati...mentre con una funzione di accesso come N() se cambia la rappresentazione interna non ci importa niente...

ilsensine
26-01-2004, 14:55
Originariamente inviato da Luc@s
...e C#( bleah) lo implementa con 2 costrutti(get, set)

Ti può sembrare strano, ma l'implementazione del C# è più corretta ;)

ilsensine
26-01-2004, 14:58
Originariamente inviato da cionci
Mettiamo che un aggiornamento dell'oggetto rinomini la variabile interna da n a num...


class pippo {
public:
union {
int n;
int num;
};
(...)
};

:p

:ops:

cionci
26-01-2004, 15:10
Vabbè ma questo è un caso semplice...metti caso che l'aggiornamento sposti n all'interno di un altro oggetto... Come fai ?

Con questo non voglio dire che una funzione del genere la utilizzerei... Utilizzerei comunque due metodi GetN e SetN ;) In ogni caso le stesse considerazioni fatte valgono anche per questi due metodi...perchè definire due metodi, ma non mettere la variabile public ?

Ad esempio:

class Prova
{
private:
int n;
public:
Prova()
{
n = 0;
};

inline int& N()
{
return n;
}


Cambia in:

class Prova
{
private:
class conf {
int n;
int n2;
friend Prova;
public:
conf() {};
};
public:
Prova()
{
n = 0;
};

inline int& N()
{
return conf.n;
}

ilsensine
26-01-2004, 15:29
Originariamente inviato da cionci
Ad esempio:
Ok hai deciso che devo far definitivamente inorridire i puristi del c++ :D

class Prova {
public:
int &n;
private:
class xyz {
public:
int y;
(...)
} num;
public:
Prova(): n(num.y) { }
(...)
};

Ok ok torno al lavoro :p

cionci
26-01-2004, 15:33
Vabbè è vero, ma mi sembra un po' un accrocco, no ?

ilsensine
26-01-2004, 15:39
Originariamente inviato da cionci
Vabbè è vero, ma mi sembra un po' un accrocco, no ?
Cosa? Assolutamente no, io sono un MAESTRO nella programmazione OD(*) :D







(*) Object Disoriented

cionci
26-01-2004, 15:53
Bello OD :)

Tra l'altro il fatto di rendere pubblico un attributo in questo modo è contrario all'information hiding ;)

cionci
26-01-2004, 15:56
E per una cosa del genere come faresti ?

class Prova
{
private:
class conf {
int n;
int n2;
public:
void SetN();
void GetN();
conf() {};
} _conf;
public:
(....)
};

ilsensine
26-01-2004, 16:20
Originariamente inviato da cionci
E per una cosa del genere come faresti ?

Tocca affidarsi alla programmazione OD avanzata :p

Vuoi veramente inorridire?


class Prova {
public:
int &n;
int &n2;
private:
class conf {
int n;
int n2;
public:
void SetN();
void GetN();
conf() {};
} _conf;
public:
Prova(): n(*(int *)&_conf), n2(*((int *)&_conf+1)) {}
};

cionci
26-01-2004, 16:25
Originariamente inviato da ilsensine
Tocca affidarsi alla programmazione OD avanzata :p

Vuoi veramente inorridire?


class Prova {
public:
int &n;
int &n2;
private:
class conf {
int n;
int n2;
public:
void SetN();
void GetN();
conf() {};
} _conf;
public:
Prova(): n(*(int *)&_conf), n2(*((int *)&_conf+1)) {}
};

Oh mamma !!! :Puke: :ave:

Luc@s
26-01-2004, 17:36
alla fine sconsigliate il mio modo di agire???

cionci
26-01-2004, 17:44
Imho sempre meglio agire con due metodi ;) A meno di particolari esigenze...

Luc@s
26-01-2004, 17:47
Originariamente inviato da cionci
Imho sempre meglio agire con due metodi ;) A meno di particolari esigenze...

Ma ha qualche controindicazione il mio metodo???


P.s: che ne pensi di visual assist x VC++6????
P.P.S: come si installano le Stl SGI si VC++6?

cionci
26-01-2004, 17:57
Originariamente inviato da Luc@s
P.s: che ne pensi di visual assist x VC++6????
P.P.S: come si installano le Stl SGI si VC++6?
Che purtroppo non è gratis, ma è un grande software...
Basta semplicemente copiarle sopra alle originali...

Luc@s
26-01-2004, 18:04
mi dai il link da dove scaricarle???
Quindi posso sovrascrivere senza paranoie?

cionci
26-01-2004, 18:14
Io l'ho fatto...

Luc@s
26-01-2004, 18:21
mi daresti in link da dove skarikarle?
E per i file .lib????

/\/\@®¢Ø
26-01-2004, 18:23
Originariamente inviato da cionci
IMHO per amentare l'astrazione...

Mettiamo che un aggiornamento dell'oggetto rinomini la variabile interna da n a num...
Mettendo n pubblica tutte i sorgenti che utilizzano n dovranno essere cambiati...mentre con una funzione di accesso come N() se cambia la rappresentazione interna non ci importa niente...

ilsensine ha gia' baston... ehm chiarito a sufficienza :D. In C++ inoltre penso abbia comunque poco senso visto che se fai un cambiamento di rappresentazione interna devi comunque ricompilare quasi sempre gli altri moduli che includono l'interfaccia della classe.

Luc@s
26-01-2004, 18:26
quindi???

cionci
26-01-2004, 18:27
Originariamente inviato da /\/\@®¢Ø
In C++ inoltre penso abbia comunque poco senso visto che se fai un cambiamento di rappresentazione interna devi comunque ricompilare quasi sempre gli altri moduli che includono l'interfaccia della classe.
Certo...ma ricompilazione è una cosa... Aggiornamento di qualche migliaio di righe di codice è un'altra ;)

cionci
26-01-2004, 18:28
Originariamente inviato da Luc@s
mi daresti in link da dove skarikarle?
E per i file .lib????
Il motore di ricerca sul sito SGI non funziona...

Luc@s
26-01-2004, 18:32
ma da dove le hai scaricate tu???
Sono solo 204 kb di zip quello che ho skarikato...........sono ok???

cionci
26-01-2004, 18:38
Boh...non so... Non credo ci sia qualche .lib... Sono template...ed in quanto tali sono solamente sorgenti, almeno epr ora...

Luc@s
26-01-2004, 18:39
azz è vero!
Mo provo :)

Luc@s
26-01-2004, 18:44
mi da 80 errori sovrascrivendo le stl presenti.............mo come risolvo????? :(:(

cionci
26-01-2004, 18:48
Ma non hai fatto un backup ? Sei sicuro di aver scaricato il file giusto ?

Luc@s
26-01-2004, 18:52
no bakup :(
Lo ho preso qui (http://www.sgi.com/tech/stl/stl.zip)

Luc@s
26-01-2004, 18:54
mi manderesti le tue?

cionci
26-01-2004, 19:07
Avevo reinstallato VC++ quindi non c'erano più le STL della SGI...
Ce le ho copiate nuovamete e funzionano perfettamente... Ho scaricato questo file: http://www.sgi.com/tech/stl/stl.zip

Fai qualche altra prova...e fammi sapere...

Luc@s
26-01-2004, 19:08
Originariamente inviato da cionci
Avevo reinstallato VC++ quindi non c'erano più le STL della SGI...
Ce le ho copiate nuovamete e funzionano perfettamente...

Fai qualche altra prova...e fammi sapere...

ma da dove le hai scaricate???
Dimmelo

cionci
26-01-2004, 19:09
Dallos tesso tuo...

Luc@s
26-01-2004, 19:14
mi da sempre 80 errori :(
La mail?

xybercom
26-01-2004, 21:13
Originariamente inviato da Luc@s
mi da 80 errori sovrascrivendo le stl presenti.............mo come risolvo????? :(:(
Il modo più semplice è passare a .NET che (imho) funziona molto meglio ma costa; ti rimane altrimenti l'opzione free di mingw /mingw studio.

Luc@s
26-01-2004, 21:17
Originariamente inviato da xybercom
Il modo più semplice è passare a .NET che (imho) funziona molto meglio ma costa; ti rimane altrimenti l'opzione free di mingw /mingw studio.

ho una copia del 2002 Enterprise a casa ......va bene?

xybercom
26-01-2004, 21:36
Non mi ricordo esattamente quando è uscito .NET, comunque se hai una versione .NET mi sembra masochismo usare la 6.0 (che a quanto ne so non è conforme allo standard attuale).