View Full Version : [PILLOLA]Proprietà in C++
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
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
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:
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
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
Bello OD :)
Tra l'altro il fatto di rendere pubblico un attributo in questo modo è contrario all'information hiding ;)
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)) {}
};
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:
alla fine sconsigliate il mio modo di agire???
Imho sempre meglio agire con due metodi ;) A meno di particolari esigenze...
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?
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...
mi dai il link da dove scaricarle???
Quindi posso sovrascrivere senza paranoie?
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.
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 ;)
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...
ma da dove le hai scaricate tu???
Sono solo 204 kb di zip quello che ho skarikato...........sono ok???
Boh...non so... Non credo ci sia qualche .lib... Sono template...ed in quanto tali sono solamente sorgenti, almeno epr ora...
mi da 80 errori sovrascrivendo le stl presenti.............mo come risolvo????? :(:(
Ma non hai fatto un backup ? Sei sicuro di aver scaricato il file giusto ?
no bakup :(
Lo ho preso qui (http://www.sgi.com/tech/stl/stl.zip)
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...
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
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.
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).
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.