Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2498 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [c++] variable décrivant une classe, est-ce possible ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[c++] variable décrivant une classe, est-ce possible ?

n°355078
theshockwa​ve
I work at a firm named Koslow
Posté le 07-04-2003 à 17:58:11  profilanswer
 

Est-il possible d'avoir une variable qui décrit une classe afin de faire un new dessus ?
 
Exemple :
 

Code :
  1. void mafonction(type uneclasse, param1, param2, param3) {
  2.   typegenerique = new (uneclasse)(param1, param2, param3);
  3.   ....
  4. }


 
Il ne me semble pas que ce soit possible, mais on vient de me demander avec tellement d'insistance que je commence à avoir un doute ... :heink:
 
donc si vous avez une explication rationnelle style "le new est interprété à la compilation et le traitement effectué dépend de la classe", alors là, je suis comblé ! ;)
 
merci d'avance :jap:

mood
Publicité
Posté le 07-04-2003 à 17:58:11  profilanswer
 

n°355080
Taz
bisounours-codeur
Posté le 07-04-2003 à 17:59:35  profilanswer
 

vive les template

n°355086
Taz
bisounours-codeur
Posté le 07-04-2003 à 18:00:59  profilanswer
 

rappel:
 
new objet
crée un objet et renvoie sont adresse
 
new (adresse) objet
crée un objet placé à partir de adresse
 
ne jamais utilisé de paranthèses avec new à moins de savoir ce qu'on fait

n°355128
theshockwa​ve
I work at a firm named Koslow
Posté le 07-04-2003 à 18:53:14  profilanswer
 

j'ai pensé aux templates ...
 
 
Etant donné que c'est pour un langage de scripts, ca pose quelques problèmes car le type de la classe n'est pas connu à la compilation ... => pas de templates ...

n°355129
theshockwa​ve
I work at a firm named Koslow
Posté le 07-04-2003 à 18:54:30  profilanswer
 

++Taz a écrit :

rappel:
 
new objet
crée un objet et renvoie sont adresse
 
new (adresse) objet
crée un objet placé à partir de adresse
 
ne jamais utilisé de paranthèses avec new à moins de savoir ce qu'on fait


 
:heink:
 
tu peux préciser, j'ai pas tout compris ... Mais en tous cas, ca m'intéresse :jap:

n°355147
MagicBuzz
Posté le 07-04-2003 à 19:09:09  profilanswer
 

Déjà, une chose, c'est que ça change pas mal d'un langage à l'autre...
 
Par exemple, pour répondre à ++Taz, en C#, il faut toujours utiliser les () lors d'un new si c'est un objet (et non un type). En fait, on fait un "new constructeur" et non pas un "new type".
 
Par exemple, déclaration d'une class en C#, contenant une propriété et une méthode :
 

Code :
  1. class C
  2. {
  3. // Attribut privé
  4. private int _x;
  5. // Propriété publique
  6. public int x
  7. {
  8.  // Le "get" est appelé lorsqu'on lit la propriété avec "a = obj.x"
  9.  get
  10.  {
  11.   if (_x > 0)
  12.   {
  13.    return _x;
  14.   }
  15.   else
  16.   {
  17.    return 0;
  18.   }
  19.  }
  20.  // Le "set" est appelé lorsqu'on écrit dans la propriété avec "obj.x = a"
  21.  // A noter que "obj.x += a" va récupérer la valeur avec le "get", lui ajouter a, puis mettre le résultat en utilisant "set"
  22.  set
  23.  {
  24.   if (value < 1000)
  25.   {
  26.    _x = value;
  27.   }
  28.   else
  29.   {
  30.    _x = 1000:
  31.   }
  32.  }
  33. }
  34. // Une méthode permettant d'ajouter une valeur à _x en utilisant le "set", puis de renvoyer le résultat en contrôlant avec le "get"
  35. public int add(int y)
  36. {
  37.  x += y;
  38.  return x;
  39. }
  40. // Contructeur simple
  41. public C ()
  42. {
  43.  // Initialisation de la valeur à 0
  44.  _x = 0;
  45. }
  46. // Contructeur prenant une valeur d'initialisation en paramètre
  47. public C (int default)
  48. {
  49.  // initialisation de la valeur en contrôlant avec le "set"
  50.  x = default;
  51. }
  52. }
  53. // Instanciation de la class (3 méthodes qui fonctionnent. Attention, la première ne contruit pas l'objet !)
  54. C a;
  55. Console.WriteLine(a.x.ToString()); // Plantage car a n'est pas instancié !
  56. C b = new C();
  57. Console.WriteLine(b.x.ToString()); // 0  
  58. C c = new C(b.x++ + 1);
  59. Console.WriteLine(c.x.ToString()); // 2
  60. Console.WriteLine(b.x.ToString()); // 1


 
Donc à partir de là, on voit tout de suite que ça peut énormément changer d'un langage à l'autre.
 
Sinon, j'ai pas bien compris. Qu'est-ce que tu veux faire exactement ? Une variable, qui lorsqu'on fait un new dessus crée un objet utilisant la class C ?
 
 
 
-- Edit : Désolé, je retourne me coucher, y'avais marqué "C++". J'ai rien dit :D --
 
-- Edit 2 : Quoique non... A ma connaissance, y'a pas de langage de script basé sur le C++, donc c'est pas du C++ --


Message édité par MagicBuzz le 07-04-2003 à 19:20:57
n°355158
Taz
bisounours-codeur
Posté le 07-04-2003 à 19:28:30  profilanswer
 

ce code est correct et sans fuite de mémoire

Code :
  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.   int *p=new int;
  6.   cout << p << '\n';
  7.   int *q=new (p) int;
  8.   cout << q << '\n';
  9.   delete p;
  10. }

n°355173
MagicBuzz
Posté le 07-04-2003 à 19:40:32  profilanswer
 

Ca fait quoi au juste ? Ca crée une variable "q" qui pointe sur "p" c'est ça ?

n°355175
Taz
bisounours-codeur
Posté le 07-04-2003 à 19:44:19  profilanswer
 

ben ça fait un new, sauf que c'est toi qui spécifie ou va etre placer l'objet, en assumant que l'adresse donnée est correcte et est le debut d'une zone mémoire suffisante pour l'objet. ça sert à réutiliser, c'sst utile notemment quand on ecrit des allocateur

n°355176
MagicBuzz
Posté le 07-04-2003 à 19:49:13  profilanswer
 

OK...
 
Mais tu as bien déclaré "q" utilisant la même adresse que "p" non ?
 
p reste valide ou il est détruit ?
 
Si oui, si je comprend bien :
 
Après ton truc (et avant le delete évidement), si tu fais :
 
p = 2;
q++;
cout << p << "\n";
 
=> Ca affiche "3", c'est bien ça ?

mood
Publicité
Posté le 07-04-2003 à 19:49:13  profilanswer
 

n°355184
Taz
bisounours-codeur
Posté le 07-04-2003 à 20:09:13  profilanswer
 

tous les pointeurs restent valides et aucun destructeur n'est appelé. le ocmportement est bien celui que tu attends
 
on utilise ça pour faire un allocateur, on demadne soit meme de la mémoire au système et on fait new (mon_adresse). ça permet de dissocier allocation et construction. voirla STL pour des fonctions de plus haut niveaux (new étant un opérateur).
 
pour finir le petit topo, new reçoit enf ait 2 arguments: le placement et la taille de l'objet à créer

n°355186
nraynaud
lol
Posté le 07-04-2003 à 20:19:57  profilanswer
 

theShOcKwAvE a écrit :

Est-il possible d'avoir une variable qui décrit une classe afin de faire un new dessus ?


 
C'est le pattern Factory que tu cherche.
Une factory est un objet qui t'en renvoie un nouveau lorsque tu lui envie la méthode qui va bien.
genre factory.createObject().
Tu peux aussi aller voir Abstract Factory pour une utilisation un peu plu fine.

n°355503
theshockwa​ve
I work at a firm named Koslow
Posté le 08-04-2003 à 10:50:47  profilanswer
 

nraynaud a écrit :


 
C'est le pattern Factory que tu cherche.
Une factory est un objet qui t'en renvoie un nouveau lorsque tu lui envie la méthode qui va bien.
genre factory.createObject().
Tu peux aussi aller voir Abstract Factory pour une utilisation un peu plu fine.


 
Merci nraynaud ! :jap:
 
j'vais jeter un coup d'oeil du côté de ces 2 "Factory"

n°355506
noldor
Rockn'roll
Posté le 08-04-2003 à 10:55:05  profilanswer
 

theShOcKwAvE a écrit :


 
Merci nraynaud ! :jap:
 
j'vais jeter un coup d'oeil du côté de ces 2 "Factory"

comme quoi, on est quand même mieux devant nos claviers qu'à l'usine

n°355528
theshockwa​ve
I work at a firm named Koslow
Posté le 08-04-2003 à 11:18:51  profilanswer
 

noldor a écrit :

comme quoi, on est quand même mieux devant nos claviers qu'à l'usine


 
;)
 
Par contre, d'après ce que je viens de lire, je ne suis pas sur que ca colle tout à fait à ce que je recherche ...
 
Pour un Look and feel, pas de pb : tu instancies une concreteFactory qui correspond au LnF que tu veux ... Ca te fait un switch acceptable pour déterminer quelle concreteFactory instancier.
 
Par contre, dans mon cas, il s'agit d'un script. Donc à chaque classe instanciée par le script, je serais obligé de recréer une factory ... :heink: Ca ne m'avance pas beaucoup plus que de créer directement la classe en question ...
 
merci quand même pour les Factory ... Je ne connaissais pas du tout, et ca peut être très utile ! :D

n°355871
nraynaud
lol
Posté le 08-04-2003 à 15:53:21  profilanswer
 

theShOcKwAvE a écrit :


 
;)
 
Par contre, d'après ce que je viens de lire, je ne suis pas sur que ca colle tout à fait à ce que je recherche ...
 
Pour un Look and feel, pas de pb : tu instancies une concreteFactory qui correspond au LnF que tu veux ... Ca te fait un switch acceptable pour déterminer quelle concreteFactory instancier.
 
Par contre, dans mon cas, il s'agit d'un script. Donc à chaque classe instanciée par le script, je serais obligé de recréer une factory ... :heink: Ca ne m'avance pas beaucoup plus que de créer directement la classe en question ...


J'ai pas tout capte.
Mais si tu veux, une factory peut creer plusieurs types d'objets : factory.createObjetType1() factory.createObjectType2() ....


---------------
trainoo.com, c'est fini
n°355874
backdafuck​up
Back to da old skool
Posté le 08-04-2003 à 15:57:03  profilanswer
 

noldor a écrit :

comme quoi, on est quand même mieux devant nos claviers qu'à l'usine

:lol:  :lol:  :lol:

n°355887
noldor
Rockn'roll
Posté le 08-04-2003 à 16:09:32  profilanswer
 

tout de même !!  :hello:

n°355889
backdafuck​up
Back to da old skool
Posté le 08-04-2003 à 16:12:02  profilanswer
 

ah mais je suis d'accord, j'admirais le jeu de mots  :D

n°355894
noldor
Rockn'roll
Posté le 08-04-2003 à 16:21:29  profilanswer
 

backdafuckup a écrit :

ah mais je suis d'accord, j'admirais le jeu de mots  :D  

:D  :p  ;)

n°355896
backdafuck​up
Back to da old skool
Posté le 08-04-2003 à 16:25:50  profilanswer
 

:sleep:  
mais keske jme fais chier au bouleau putain....

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [c++] variable décrivant une classe, est-ce possible ?

 

Sujets relatifs
[C, C++] Timer et fonction membre d'une classe[HTML] ou [PHP] C'est possible ?
Grosse variable de session, est-ce bienAttribuer une touche du clavier à une autre est-ce possible ?
c'est combien la durée de vie d'une variable PHP ? Aidez moi SVP ![script ksh] probleme variable dans awk
retrouver le type d'une variablePHP + Scanner reseau is it possible?
Enregistrement ActiveX: possible dans LOCAL_MACHINE ??incrémenter une variable
Plus de sujets relatifs à : [c++] variable décrivant une classe, est-ce possible ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR