PDA

View Full Version : [C++] Dubbi su "this"


vendettaaaaa
10-12-2012, 15:04
Ciao.
Ho una classe con una funzione membro che deve chiamare una funzione che necessariamente non deve esser parte di alcuna classe. Però questa funzione esterna deve chiamare funzioni membro per fare dei conti.
Ho risolto così:
Creo un namespace BubbleDew dove passo alla funzione esterna alcuni dati e un puntatore all'oggetto chiamante:
class Mixture;

namespace BubbleDew
{
enum WhichCalculation {
BubblePressure,
BubbleTemp,
DewPressure,
DewTemp
};

extern double T;
extern double P;
extern BzzVector xLiq;
extern BzzVector yVap;

extern WhichCalculation check;
extern Mixture* mix;
}

Quindi dalla funzione membro (compute_dew_T_direct) salvo i dati nel namespace, poi chiamo la funzione esterna funsys_Td, la quale usa Mixture* mix per chiamare a sua volta membri (membri const) di Mixture, cioè dentro a funsys_Td chiamo mix->compute_phi()
void funsys_Td(BzzVector& z, BzzVector& f)
{
if (BubbleDew::check != BubbleDew::DewTemp) ; // TODO Error, wrong function call

double T = z[1];
BzzVector xLiq(z);
xLiq.DeleteElement(1);

double& P = BubbleDew::P;
BzzVector& yVap = BubbleDew::yVap;
Mixture* mix = BubbleDew::mix;

PhiMix vap = mix->compute_phi(T, P, yVap, PR);

PhiMix liq = mix->compute_phi(T, P, xLiq, PR);

[CUT]
}

DewT Mixture::compute_dew_T_direct(const double& P, const BzzVector& yVap)
{
if (yVap.Size() != nSpecies) ;// TODO Error
BubbleDew::yVap = yVap;
BubbleDew::P = P;
BubbleDew::check = BubbleDew::DewTemp;
BubbleDew::mix = this;

[CUT]
}

Il codice funziona, ma oltre a sembrarmi poco sicuro, il mio dubbio più forte è: come mai il compilatore non mi da errore quando, in compute_dew_T_direct, assegno this, che è un const Mixture*, a Mixture* mix che sta nel namespace?? E' forse un'ottimizzazione di VS2012 a permetterlo, dato che nella funzione esterna chiamo solo membri const?? Mi pare strano visto che in linea di principio potrei chiamare membri non const...

vendettaaaaa
11-12-2012, 10:22
Up! Ho riletto il post e mi sembra scritto in modo conciso e comprensibile, con una capacità di sintesi che raramente mi caratterizza; pure il codice postato son due definizioni in croce, niente di complicato, su su qualcuno mi aiuti! :D

vendettaaaaa
13-12-2012, 16:06
Ultimo up, poi ci rinuncio :muro:

tomminno
14-12-2012, 11:33
Ultimo up, poi ci rinuncio :muro:

this è definito dallo standard C++ come "cv-unqualified".
Detto in parole povere è "const Type *" in un metodo const e "Type *" in un metodo non const.
Mi perdonino i puristi...

vendettaaaaa
14-12-2012, 12:31
this è definito dallo standard C++ come "cv-unqualified".
Detto in parole povere è "const Type *" in un metodo const e "Type *" in un metodo non const.
Mi perdonino i puristi...
Hmm...in un altro contesto cerco di assegnare a this, in un metodo non const, un altro puntatore ma mi dice che this è const (trasposizione di una matrice non quadrata: creo Matrix* temp, lo riempio, poi dealloco la matrice di partenza e tento di fare this = temp). Ma forse c'è qualcos'altro di mezzo? :boh: