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...
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...