et SQL n'est pas applicable ?
non, pas vraiment.
et SQL n'est pas applicable ?
non, pas vraiment.
et SQL n'est pas applicable ?
non, pas vraiment.
Une première question : quel est le rÔle de ces objets dans ton
programme ?
Je développe un logiciel destiné à effectuer des traitements statis tiques
sur des données.
Pour cela, je cherche à implémenter un langage "simple" compréhensi ble par
quelqu'un qui ne fait pas de blocage sur l'ordinateur mais qui n'est pas
informaticien non plus :-) ! Dans le monde des enquêtes, c'est relative ment
courant...
(je sais pas si tu connais le langage SAS de SAS Institute, développé dans
les années 70 et qui n'a pas fondamentalement évolué dans sa struct ure. Dans
la version 8, il n'est toujours pas possible de définir des fonctions - c'est
quand même un concept bien pratique !- et il faut se débrouiller avec un
langage macro que mon intelligence normale ne me permet pas de comprendre.
En gros, j'écris "presque n'importe quoi" et je regarde ce que ça fai t !
C'est souvent lassant...). Tous mes clients qui utilisent SAS seraient pr êts
à changer pour n'importe quoi de plus simple, surtout qu'en général ils
veulent juste faire des choses basiques (genre tris croisés). Cette pet ite
intro rapide, c'est pour t'expliquer le contexte !
Les utilisateurs ont des tables de données importantes, au minimum 1.000
enregistrements et souvent + de 100.000 et il veulent
"traiter" les données.
Par exemple, dans une enquête ils ont demandé l'âge du chef de mé nage et les
revenus du ménage et ils veulent juste croiser des tranches d'âge ave c des
tranches de revenus.
tu vas écrire des trucs du genre (dans le style SAS):
tranche_age=6;
if age<60 then tranche_age=5;
if age<50 then tranche_age=4;
if age<40 then tranche_age=3;
if age<30 then tranche_age=2;
if age<20 then tranche_age=1;
Pour moi, la variable age est un "tableau" de 1000 entiers par exemple.
Tu vois qu'il s'agit de gros objets. C'est pourquoi je préfère que le
tableau réel soit alloué dans le tas, d'autant que j'ai prévu des
constructeurs qui récupèrent juste l'adresse de l'objet (en en prenant
possession ou pas).
En fait, j'ai défini une classe particulière
template <typename T> class CValue
pour implémenter les valeurs manquantes pour les types primaires -ou
autres - et c'est donc un "tableau" de 1000 CValue<int>.
Ma classe CValue répond aussi à une autre nécessité : définir l es quelques
méthodes qui doivent être implémentées par TOUS les objets suscep tibles
d'être mis dans un CVariant.
Et une méthode est essentielle, c'est
virtual CVariant& get_property(std::string const& property_name)
Note que get_property retourne bien une référence et non un CVariant.
Ma classe CVariant a pour but de manipuler un ensemble d'objets
hiérarchisés, où les uns sont des propriétés des autres. C'est pas
exactement une classe CVariant "habituelle".
Par exemple, quand l'utilisateur écrit
int x=1;
l'interpréteur va créer un objet
CVariable<int> obj_x("x",1); // nom et valeur dans le constructeur
La valeur 1 va être stockée dans un objet CValue crée dans le tas e t pointé
par la donnée membre de CVariantSpecifique.
CVariable est une classe dérivée de CVariant qui redéfini get_prope rty
CVariable représente pour moi les variables "primaires", c'est à dire qui
n'ont pas de parent.
Les objets de cette classe possèdent par exemple les propriétés
name (ici "x")
typename (int/string/...)
missing
statut ->lecture seule O/N (pour les const)
si l'utilisateur tape
x.name
l'interpréteur appelle la méthode obj_x.get_property qui va retourner une
réference vers un CVariant qui contient le nom de la variable (en fait il
s'agira d'une référence vers un objet CConstante<U> dérivé de CVa riant et
qui est une donnée membre de CVariable<T>)
Pour comprendre le schéma fonctionnel, il y a une distinction entre la
valeur de l'objet, qui est stockée dans la classe CVariant Specifique e t le
type (au sens constante/variable/propriété) de l'objet qui est déte rminé par
le type de la classe dérivée de CVariant utilisé lors de la créat ion de
l'objet !
Mais TOUS les objets que je manipule par l'interpréteur (je veux dire
accessibles aux utilisateurs) définissent la méthode get_property (et
quelques autres). C'est donc aussi le cas de la valeur de l'objet, qui pe ut
d'ailleurs être elle-même un objet et avoir ou non des propriétés.
get_property gère aussi tous les messages d'erreurs liés à l'objet (lecture
seule/propriété inexistante...)
Au sujet de l'opérateur =
Tu as raison, dans la classe CVariantSpecific, il ne faut pas le redéfi nir.
Je l'avais fait mais c'est parfaitement inutile parce que CVariantSpecifi que
n'est jamais une lvalue car on ne manipule que des objets qui ne sont pas
directement "parent" (l'inverse de dérivé, je ne sais pas comment on dit) de
CVariantSpecific.
Pour les autres classes dérivées de CVariant par contre, il me faut le
redéfinir.
Pour que tu comprennes mieux, je te livre la définition simple des
constantes.
template<typename T>
class CConstante : public CVariant
{
typedef T Type;
public :
CConstante(Type const& t,std::string reference)
: CVariant(Empty()),
_reference(reference)
{ _variant=new CVariantSpecifique< T >(t); }
CConstante(CConstante const& x)
: CVariant(Empty()),
_reference(x._reference)
{ _variant=x._variant->duplicate();}
virtual ~CConstante() {}
//protected :
// la constante ne peut être une lvalue
virtual CVariant operator++(int)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant operator--(int)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator=(CVariant const&)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);} // <- ici
par exemple
virtual CVariant& operator++()
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator--()
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator+=(CVariant const&)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator-=(CVariant const&)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator*=(CVariant const&)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator/=(CVariant const&)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual void set_missing(void)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant* duplicate(void) const { return new
CConstante(*this); }
std::string _reference;
// les constantes ne possèdent pas de propriétés
virtual CVariant& get_property(std::string const& property_name)
{ throw
CException(_reference+std::string(CCONSTANTE_NOPROPERTY_MSG)); }
virtual bool contains(CVariant const& right) const { return false;}
virtual bool read_only(void) const { return true;}
};
En fait mon interpréteur ne manipule que des objets CVariants.
Le seul moment où je dois manipuler d'autres classes dérivées, c'es t au
moment de la déclaration.
S'agit-il d'une constante, variable et bien sûr de quel objet.
ex:
table a;
CVariable< CTable> obj_table("a"); par exemple.
Mais comme tous les opérateurs peuvent être potentiellement utilisé s par les
CVariants, les objets disposent d'une données membres static unsigned i nt
qui mémorise les opérateurs légitimes sur l'objet. Pour les autres, une
exception est lancée.
Seule lourdeur, il me faut définir toutes les conversions 2 à 2.
Mais bon, je suppose qu'il faut le faire de toutes façons, quelle que s oit
la méthode choisie. Pour les objets qui peuvent se convertir, il faut
l'écrire :-).
Et pour les autres, c'est vite dit (dans une petite macro par exemple pour
aller plus vite).
Et dans ma classe de Contexte, j'aurai (c'est pas encore programmé) , s auf
surprise :-), que des pointeurs vers des CVariants.
J'espère que j'ai été clair et pas trop long...
Si tu vas jusqu'au bout Et que j'ai été clair, ça m'interesse de sa voir si
c'est un modèle sinon connu (on développe pas tous les modèles dans la vie
!), du moins intéressant et pertinant.
Une première question : quel est le rÔle de ces objets dans ton
programme ?
Je développe un logiciel destiné à effectuer des traitements statis tiques
sur des données.
Pour cela, je cherche à implémenter un langage "simple" compréhensi ble par
quelqu'un qui ne fait pas de blocage sur l'ordinateur mais qui n'est pas
informaticien non plus :-) ! Dans le monde des enquêtes, c'est relative ment
courant...
(je sais pas si tu connais le langage SAS de SAS Institute, développé dans
les années 70 et qui n'a pas fondamentalement évolué dans sa struct ure. Dans
la version 8, il n'est toujours pas possible de définir des fonctions - c'est
quand même un concept bien pratique !- et il faut se débrouiller avec un
langage macro que mon intelligence normale ne me permet pas de comprendre.
En gros, j'écris "presque n'importe quoi" et je regarde ce que ça fai t !
C'est souvent lassant...). Tous mes clients qui utilisent SAS seraient pr êts
à changer pour n'importe quoi de plus simple, surtout qu'en général ils
veulent juste faire des choses basiques (genre tris croisés). Cette pet ite
intro rapide, c'est pour t'expliquer le contexte !
Les utilisateurs ont des tables de données importantes, au minimum 1.000
enregistrements et souvent + de 100.000 et il veulent
"traiter" les données.
Par exemple, dans une enquête ils ont demandé l'âge du chef de mé nage et les
revenus du ménage et ils veulent juste croiser des tranches d'âge ave c des
tranches de revenus.
tu vas écrire des trucs du genre (dans le style SAS):
tranche_age=6;
if age<60 then tranche_age=5;
if age<50 then tranche_age=4;
if age<40 then tranche_age=3;
if age<30 then tranche_age=2;
if age<20 then tranche_age=1;
Pour moi, la variable age est un "tableau" de 1000 entiers par exemple.
Tu vois qu'il s'agit de gros objets. C'est pourquoi je préfère que le
tableau réel soit alloué dans le tas, d'autant que j'ai prévu des
constructeurs qui récupèrent juste l'adresse de l'objet (en en prenant
possession ou pas).
En fait, j'ai défini une classe particulière
template <typename T> class CValue
pour implémenter les valeurs manquantes pour les types primaires -ou
autres - et c'est donc un "tableau" de 1000 CValue<int>.
Ma classe CValue répond aussi à une autre nécessité : définir l es quelques
méthodes qui doivent être implémentées par TOUS les objets suscep tibles
d'être mis dans un CVariant.
Et une méthode est essentielle, c'est
virtual CVariant& get_property(std::string const& property_name)
Note que get_property retourne bien une référence et non un CVariant.
Ma classe CVariant a pour but de manipuler un ensemble d'objets
hiérarchisés, où les uns sont des propriétés des autres. C'est pas
exactement une classe CVariant "habituelle".
Par exemple, quand l'utilisateur écrit
int x=1;
l'interpréteur va créer un objet
CVariable<int> obj_x("x",1); // nom et valeur dans le constructeur
La valeur 1 va être stockée dans un objet CValue crée dans le tas e t pointé
par la donnée membre de CVariantSpecifique.
CVariable est une classe dérivée de CVariant qui redéfini get_prope rty
CVariable représente pour moi les variables "primaires", c'est à dire qui
n'ont pas de parent.
Les objets de cette classe possèdent par exemple les propriétés
name (ici "x")
typename (int/string/...)
missing
statut ->lecture seule O/N (pour les const)
si l'utilisateur tape
x.name
l'interpréteur appelle la méthode obj_x.get_property qui va retourner une
réference vers un CVariant qui contient le nom de la variable (en fait il
s'agira d'une référence vers un objet CConstante<U> dérivé de CVa riant et
qui est une donnée membre de CVariable<T>)
Pour comprendre le schéma fonctionnel, il y a une distinction entre la
valeur de l'objet, qui est stockée dans la classe CVariant Specifique e t le
type (au sens constante/variable/propriété) de l'objet qui est déte rminé par
le type de la classe dérivée de CVariant utilisé lors de la créat ion de
l'objet !
Mais TOUS les objets que je manipule par l'interpréteur (je veux dire
accessibles aux utilisateurs) définissent la méthode get_property (et
quelques autres). C'est donc aussi le cas de la valeur de l'objet, qui pe ut
d'ailleurs être elle-même un objet et avoir ou non des propriétés.
get_property gère aussi tous les messages d'erreurs liés à l'objet (lecture
seule/propriété inexistante...)
Au sujet de l'opérateur =
Tu as raison, dans la classe CVariantSpecific, il ne faut pas le redéfi nir.
Je l'avais fait mais c'est parfaitement inutile parce que CVariantSpecifi que
n'est jamais une lvalue car on ne manipule que des objets qui ne sont pas
directement "parent" (l'inverse de dérivé, je ne sais pas comment on dit) de
CVariantSpecific.
Pour les autres classes dérivées de CVariant par contre, il me faut le
redéfinir.
Pour que tu comprennes mieux, je te livre la définition simple des
constantes.
template<typename T>
class CConstante : public CVariant
{
typedef T Type;
public :
CConstante(Type const& t,std::string reference)
: CVariant(Empty()),
_reference(reference)
{ _variant=new CVariantSpecifique< T >(t); }
CConstante(CConstante const& x)
: CVariant(Empty()),
_reference(x._reference)
{ _variant=x._variant->duplicate();}
virtual ~CConstante() {}
//protected :
// la constante ne peut être une lvalue
virtual CVariant operator++(int)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant operator--(int)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator=(CVariant const&)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);} // <- ici
par exemple
virtual CVariant& operator++()
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator--()
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator+=(CVariant const&)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator-=(CVariant const&)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator*=(CVariant const&)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator/=(CVariant const&)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual void set_missing(void)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant* duplicate(void) const { return new
CConstante(*this); }
std::string _reference;
// les constantes ne possèdent pas de propriétés
virtual CVariant& get_property(std::string const& property_name)
{ throw
CException(_reference+std::string(CCONSTANTE_NOPROPERTY_MSG)); }
virtual bool contains(CVariant const& right) const { return false;}
virtual bool read_only(void) const { return true;}
};
En fait mon interpréteur ne manipule que des objets CVariants.
Le seul moment où je dois manipuler d'autres classes dérivées, c'es t au
moment de la déclaration.
S'agit-il d'une constante, variable et bien sûr de quel objet.
ex:
table a;
CVariable< CTable> obj_table("a"); par exemple.
Mais comme tous les opérateurs peuvent être potentiellement utilisé s par les
CVariants, les objets disposent d'une données membres static unsigned i nt
qui mémorise les opérateurs légitimes sur l'objet. Pour les autres, une
exception est lancée.
Seule lourdeur, il me faut définir toutes les conversions 2 à 2.
Mais bon, je suppose qu'il faut le faire de toutes façons, quelle que s oit
la méthode choisie. Pour les objets qui peuvent se convertir, il faut
l'écrire :-).
Et pour les autres, c'est vite dit (dans une petite macro par exemple pour
aller plus vite).
Et dans ma classe de Contexte, j'aurai (c'est pas encore programmé) , s auf
surprise :-), que des pointeurs vers des CVariants.
J'espère que j'ai été clair et pas trop long...
Si tu vas jusqu'au bout Et que j'ai été clair, ça m'interesse de sa voir si
c'est un modèle sinon connu (on développe pas tous les modèles dans la vie
!), du moins intéressant et pertinant.
Une première question : quel est le rÔle de ces objets dans ton
programme ?
Je développe un logiciel destiné à effectuer des traitements statis tiques
sur des données.
Pour cela, je cherche à implémenter un langage "simple" compréhensi ble par
quelqu'un qui ne fait pas de blocage sur l'ordinateur mais qui n'est pas
informaticien non plus :-) ! Dans le monde des enquêtes, c'est relative ment
courant...
(je sais pas si tu connais le langage SAS de SAS Institute, développé dans
les années 70 et qui n'a pas fondamentalement évolué dans sa struct ure. Dans
la version 8, il n'est toujours pas possible de définir des fonctions - c'est
quand même un concept bien pratique !- et il faut se débrouiller avec un
langage macro que mon intelligence normale ne me permet pas de comprendre.
En gros, j'écris "presque n'importe quoi" et je regarde ce que ça fai t !
C'est souvent lassant...). Tous mes clients qui utilisent SAS seraient pr êts
à changer pour n'importe quoi de plus simple, surtout qu'en général ils
veulent juste faire des choses basiques (genre tris croisés). Cette pet ite
intro rapide, c'est pour t'expliquer le contexte !
Les utilisateurs ont des tables de données importantes, au minimum 1.000
enregistrements et souvent + de 100.000 et il veulent
"traiter" les données.
Par exemple, dans une enquête ils ont demandé l'âge du chef de mé nage et les
revenus du ménage et ils veulent juste croiser des tranches d'âge ave c des
tranches de revenus.
tu vas écrire des trucs du genre (dans le style SAS):
tranche_age=6;
if age<60 then tranche_age=5;
if age<50 then tranche_age=4;
if age<40 then tranche_age=3;
if age<30 then tranche_age=2;
if age<20 then tranche_age=1;
Pour moi, la variable age est un "tableau" de 1000 entiers par exemple.
Tu vois qu'il s'agit de gros objets. C'est pourquoi je préfère que le
tableau réel soit alloué dans le tas, d'autant que j'ai prévu des
constructeurs qui récupèrent juste l'adresse de l'objet (en en prenant
possession ou pas).
En fait, j'ai défini une classe particulière
template <typename T> class CValue
pour implémenter les valeurs manquantes pour les types primaires -ou
autres - et c'est donc un "tableau" de 1000 CValue<int>.
Ma classe CValue répond aussi à une autre nécessité : définir l es quelques
méthodes qui doivent être implémentées par TOUS les objets suscep tibles
d'être mis dans un CVariant.
Et une méthode est essentielle, c'est
virtual CVariant& get_property(std::string const& property_name)
Note que get_property retourne bien une référence et non un CVariant.
Ma classe CVariant a pour but de manipuler un ensemble d'objets
hiérarchisés, où les uns sont des propriétés des autres. C'est pas
exactement une classe CVariant "habituelle".
Par exemple, quand l'utilisateur écrit
int x=1;
l'interpréteur va créer un objet
CVariable<int> obj_x("x",1); // nom et valeur dans le constructeur
La valeur 1 va être stockée dans un objet CValue crée dans le tas e t pointé
par la donnée membre de CVariantSpecifique.
CVariable est une classe dérivée de CVariant qui redéfini get_prope rty
CVariable représente pour moi les variables "primaires", c'est à dire qui
n'ont pas de parent.
Les objets de cette classe possèdent par exemple les propriétés
name (ici "x")
typename (int/string/...)
missing
statut ->lecture seule O/N (pour les const)
si l'utilisateur tape
x.name
l'interpréteur appelle la méthode obj_x.get_property qui va retourner une
réference vers un CVariant qui contient le nom de la variable (en fait il
s'agira d'une référence vers un objet CConstante<U> dérivé de CVa riant et
qui est une donnée membre de CVariable<T>)
Pour comprendre le schéma fonctionnel, il y a une distinction entre la
valeur de l'objet, qui est stockée dans la classe CVariant Specifique e t le
type (au sens constante/variable/propriété) de l'objet qui est déte rminé par
le type de la classe dérivée de CVariant utilisé lors de la créat ion de
l'objet !
Mais TOUS les objets que je manipule par l'interpréteur (je veux dire
accessibles aux utilisateurs) définissent la méthode get_property (et
quelques autres). C'est donc aussi le cas de la valeur de l'objet, qui pe ut
d'ailleurs être elle-même un objet et avoir ou non des propriétés.
get_property gère aussi tous les messages d'erreurs liés à l'objet (lecture
seule/propriété inexistante...)
Au sujet de l'opérateur =
Tu as raison, dans la classe CVariantSpecific, il ne faut pas le redéfi nir.
Je l'avais fait mais c'est parfaitement inutile parce que CVariantSpecifi que
n'est jamais une lvalue car on ne manipule que des objets qui ne sont pas
directement "parent" (l'inverse de dérivé, je ne sais pas comment on dit) de
CVariantSpecific.
Pour les autres classes dérivées de CVariant par contre, il me faut le
redéfinir.
Pour que tu comprennes mieux, je te livre la définition simple des
constantes.
template<typename T>
class CConstante : public CVariant
{
typedef T Type;
public :
CConstante(Type const& t,std::string reference)
: CVariant(Empty()),
_reference(reference)
{ _variant=new CVariantSpecifique< T >(t); }
CConstante(CConstante const& x)
: CVariant(Empty()),
_reference(x._reference)
{ _variant=x._variant->duplicate();}
virtual ~CConstante() {}
//protected :
// la constante ne peut être une lvalue
virtual CVariant operator++(int)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant operator--(int)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator=(CVariant const&)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);} // <- ici
par exemple
virtual CVariant& operator++()
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator--()
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator+=(CVariant const&)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator-=(CVariant const&)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator*=(CVariant const&)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant& operator/=(CVariant const&)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual void set_missing(void)
{ throw CException(_reference+CCONSTANTE_NOLEFT_MSG);}
virtual CVariant* duplicate(void) const { return new
CConstante(*this); }
std::string _reference;
// les constantes ne possèdent pas de propriétés
virtual CVariant& get_property(std::string const& property_name)
{ throw
CException(_reference+std::string(CCONSTANTE_NOPROPERTY_MSG)); }
virtual bool contains(CVariant const& right) const { return false;}
virtual bool read_only(void) const { return true;}
};
En fait mon interpréteur ne manipule que des objets CVariants.
Le seul moment où je dois manipuler d'autres classes dérivées, c'es t au
moment de la déclaration.
S'agit-il d'une constante, variable et bien sûr de quel objet.
ex:
table a;
CVariable< CTable> obj_table("a"); par exemple.
Mais comme tous les opérateurs peuvent être potentiellement utilisé s par les
CVariants, les objets disposent d'une données membres static unsigned i nt
qui mémorise les opérateurs légitimes sur l'objet. Pour les autres, une
exception est lancée.
Seule lourdeur, il me faut définir toutes les conversions 2 à 2.
Mais bon, je suppose qu'il faut le faire de toutes façons, quelle que s oit
la méthode choisie. Pour les objets qui peuvent se convertir, il faut
l'écrire :-).
Et pour les autres, c'est vite dit (dans une petite macro par exemple pour
aller plus vite).
Et dans ma classe de Contexte, j'aurai (c'est pas encore programmé) , s auf
surprise :-), que des pointeurs vers des CVariants.
J'espère que j'ai été clair et pas trop long...
Si tu vas jusqu'au bout Et que j'ai été clair, ça m'interesse de sa voir si
c'est un modèle sinon connu (on développe pas tous les modèles dans la vie
!), du moins intéressant et pertinant.
Une première question : quel est le rÔle de ces objets dans ton
programme ?
Je développe un logiciel destiné à effectuer des traitements statistiques
sur des données.
Pour cela, je cherche à implémenter un langage "simple" compréhensible par
quelqu'un qui ne fait pas de blocage sur l'ordinateur mais qui n'est pas
informaticien non plus :-) ! Dans le monde des enquêtes, c'est relativement
courant...
Une première question : quel est le rÔle de ces objets dans ton
programme ?
Je développe un logiciel destiné à effectuer des traitements statistiques
sur des données.
Pour cela, je cherche à implémenter un langage "simple" compréhensible par
quelqu'un qui ne fait pas de blocage sur l'ordinateur mais qui n'est pas
informaticien non plus :-) ! Dans le monde des enquêtes, c'est relativement
courant...
Une première question : quel est le rÔle de ces objets dans ton
programme ?
Je développe un logiciel destiné à effectuer des traitements statistiques
sur des données.
Pour cela, je cherche à implémenter un langage "simple" compréhensible par
quelqu'un qui ne fait pas de blocage sur l'ordinateur mais qui n'est pas
informaticien non plus :-) ! Dans le monde des enquêtes, c'est relativement
courant...
template<typename T>
class CConstante : public CVariant
Et c'est là où je décroche. Une Constante n'est pas un Variant,
parce qu'il a un type bien précis, qui ne peut pas varier.
Pourquoi veux-tu qu'il dérive de Variant.
Ou si tu ne te sens pas à l'aise avec de la
métaprogrammation
template<typename T>
class CConstante : public CVariant
Et c'est là où je décroche. Une Constante n'est pas un Variant,
parce qu'il a un type bien précis, qui ne peut pas varier.
Pourquoi veux-tu qu'il dérive de Variant.
Ou si tu ne te sens pas à l'aise avec de la
métaprogrammation
template<typename T>
class CConstante : public CVariant
Et c'est là où je décroche. Une Constante n'est pas un Variant,
parce qu'il a un type bien précis, qui ne peut pas varier.
Pourquoi veux-tu qu'il dérive de Variant.
Ou si tu ne te sens pas à l'aise avec de la
métaprogrammation
Est-ce que tu connais ça :
http://www.r-project.org/
Est-ce que tu connais ça :
http://www.r-project.org/
Est-ce que tu connais ça :
http://www.r-project.org/
template<typename T>
class CConstante : public CVariant
Et c'est là où je décroche. Une Constante n'est pas un Variant,
parce qu'il a un type bien précis, qui ne peut pas varier.
Pourquoi veux-tu qu'il dérive de Variant.
En fait, je crois qu'il y a incompréhension entre nous.
LE problème, c'est qu'une méthode qui retourne une propriété quel conque ne
peut retourner QU'UN VARIANT (ou une référence vers un variant, comme je le
fait), puisqu'on ne peut pas changer le type de retour.
D'OU l'idée d'implémenter les propriétés des objets visibles à l'utilisateur
elles-mêmes comme des variants, ce qui évite toute copie !
Dans l'exemple que je t'avais donné, une constante est un variant qui
n'autorise aucune opération modifiant sa valeur, comme tu peux le voir dans
le code que j'ai donné.
Dans ce cas, on s'éloigne effectivement de l'idée de
variant : il s'agit plutôt d'utiliser CVariant comme classe de base pour
permettre de manipuler les objets avec un type visible unique (le type
CVariant). Mais la classe de base des objets
CConstante<T>/CVariable<T>/CProperty<T>...est bien la classe CVariant, te lle
qu'elle serait définie pour implémenter des variants, à la différ ence près
que les opérateurs et quelques autres méthodes sont virtuels, au cas où il
ne s'agisse pas de CVariant !
C'est certain qu'il s'agit d'un mélange de 2 concepts et que cette mé thode
n'est pertinente que si les objets utilisés dans les CVariant sont "ass ez"
volumineux (enfin pas les types primaires) puisque j'introduis des appels de
méthodes virtuelles. Mais c'est mon cas.
Ou si tu ne te sens pas à l'aise avec de la
métaprogrammation
c'est mon cas, hélas...
template<typename T>
class CConstante : public CVariant
Et c'est là où je décroche. Une Constante n'est pas un Variant,
parce qu'il a un type bien précis, qui ne peut pas varier.
Pourquoi veux-tu qu'il dérive de Variant.
En fait, je crois qu'il y a incompréhension entre nous.
LE problème, c'est qu'une méthode qui retourne une propriété quel conque ne
peut retourner QU'UN VARIANT (ou une référence vers un variant, comme je le
fait), puisqu'on ne peut pas changer le type de retour.
D'OU l'idée d'implémenter les propriétés des objets visibles à l'utilisateur
elles-mêmes comme des variants, ce qui évite toute copie !
Dans l'exemple que je t'avais donné, une constante est un variant qui
n'autorise aucune opération modifiant sa valeur, comme tu peux le voir dans
le code que j'ai donné.
Dans ce cas, on s'éloigne effectivement de l'idée de
variant : il s'agit plutôt d'utiliser CVariant comme classe de base pour
permettre de manipuler les objets avec un type visible unique (le type
CVariant). Mais la classe de base des objets
CConstante<T>/CVariable<T>/CProperty<T>...est bien la classe CVariant, te lle
qu'elle serait définie pour implémenter des variants, à la différ ence près
que les opérateurs et quelques autres méthodes sont virtuels, au cas où il
ne s'agisse pas de CVariant !
C'est certain qu'il s'agit d'un mélange de 2 concepts et que cette mé thode
n'est pertinente que si les objets utilisés dans les CVariant sont "ass ez"
volumineux (enfin pas les types primaires) puisque j'introduis des appels de
méthodes virtuelles. Mais c'est mon cas.
Ou si tu ne te sens pas à l'aise avec de la
métaprogrammation
c'est mon cas, hélas...
template<typename T>
class CConstante : public CVariant
Et c'est là où je décroche. Une Constante n'est pas un Variant,
parce qu'il a un type bien précis, qui ne peut pas varier.
Pourquoi veux-tu qu'il dérive de Variant.
En fait, je crois qu'il y a incompréhension entre nous.
LE problème, c'est qu'une méthode qui retourne une propriété quel conque ne
peut retourner QU'UN VARIANT (ou une référence vers un variant, comme je le
fait), puisqu'on ne peut pas changer le type de retour.
D'OU l'idée d'implémenter les propriétés des objets visibles à l'utilisateur
elles-mêmes comme des variants, ce qui évite toute copie !
Dans l'exemple que je t'avais donné, une constante est un variant qui
n'autorise aucune opération modifiant sa valeur, comme tu peux le voir dans
le code que j'ai donné.
Dans ce cas, on s'éloigne effectivement de l'idée de
variant : il s'agit plutôt d'utiliser CVariant comme classe de base pour
permettre de manipuler les objets avec un type visible unique (le type
CVariant). Mais la classe de base des objets
CConstante<T>/CVariable<T>/CProperty<T>...est bien la classe CVariant, te lle
qu'elle serait définie pour implémenter des variants, à la différ ence près
que les opérateurs et quelques autres méthodes sont virtuels, au cas où il
ne s'agisse pas de CVariant !
C'est certain qu'il s'agit d'un mélange de 2 concepts et que cette mé thode
n'est pertinente que si les objets utilisés dans les CVariant sont "ass ez"
volumineux (enfin pas les types primaires) puisque j'introduis des appels de
méthodes virtuelles. Mais c'est mon cas.
Ou si tu ne te sens pas à l'aise avec de la
métaprogrammation
c'est mon cas, hélas...
En fait, l'expérience montre que si tu fais une bonne
conception et une implémentation où chaque décision est bien
encapsulée, tu arriveras à la fin à plus de performance que si
tu essaies d'optimiser dès le début.
En fait, l'expérience montre que si tu fais une bonne
conception et une implémentation où chaque décision est bien
encapsulée, tu arriveras à la fin à plus de performance que si
tu essaies d'optimiser dès le début.
En fait, l'expérience montre que si tu fais une bonne
conception et une implémentation où chaque décision est bien
encapsulée, tu arriveras à la fin à plus de performance que si
tu essaies d'optimiser dès le début.