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

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

Marsh Posté le 07-04-2003 à 17:58:11    

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:

Reply

Marsh Posté le 07-04-2003 à 17:58:11   

Reply

Marsh Posté le 07-04-2003 à 17:59:35    

vive les template

Reply

Marsh Posté le 07-04-2003 à 18:00:59    

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

Reply

Marsh Posté le 07-04-2003 à 18:53:14    

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

Reply

Marsh Posté le 07-04-2003 à 18:54:30    

++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:

Reply

Marsh Posté le 07-04-2003 à 19:09:09    

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
Reply

Marsh Posté le 07-04-2003 à 19:28:30    

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

Reply

Marsh Posté le 07-04-2003 à 19:40:32    

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

Reply

Marsh Posté le 07-04-2003 à 19:44:19    

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

Reply

Marsh Posté le 07-04-2003 à 19:49:13    

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 ?

Reply

Marsh Posté le 07-04-2003 à 19:49:13   

Reply

Marsh Posté le 07-04-2003 à 20:09:13    

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

Reply

Marsh Posté le 07-04-2003 à 20:19:57    

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.

Reply

Marsh Posté le 08-04-2003 à 10:50:47    

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"

Reply

Marsh Posté le 08-04-2003 à 10:55:05    

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

Reply

Marsh Posté le 08-04-2003 à 11:18:51    

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

Reply

Marsh Posté le 08-04-2003 à 15:53:21    

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
Reply

Marsh Posté le 08-04-2003 à 15:57:03    

noldor a écrit :

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

:lol:  :lol:  :lol:

Reply

Marsh Posté le 08-04-2003 à 16:09:32    

tout de même !!  :hello:

Reply

Marsh Posté le 08-04-2003 à 16:12:02    

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

Reply

Marsh Posté le 08-04-2003 à 16:21:29    

backdafuckup a écrit :

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

:D  :p  ;)

Reply

Marsh Posté le 08-04-2003 à 16:25:50    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed