[C++] histoire de constructeurs

histoire de constructeurs [C++] - C++ - Programmation

Marsh Posté le 23-04-2004 à 01:36:00    

Je souhaiterais ajouter une fonctionnalité à std::vector<>. Je créé donc une struct/class par héritage.  

Code :
  1. template<typename T>
  2. struct vector_ameliore : public std::vector<T>
  3. {
  4. /***/
  5. };


 
Afin de pouvoir utiliser les différents constructeurs de std::vector<>, est ce que je dois vraiment me les 'taper' un par un dans la classe dérivée ?
 
Genre :

Code :
  1. vector_ameliore(size_type & t ) : std::vector<T>(t) {}
  2. vector_ameliore(const T * b, const T * e ) : std::vector<T>(b,e) {}
  3. /***/


 
D'autre part (c'est un autre pb), comment peut-on créer simplement une classe qui hérite d'un type de base : int, char, enum,...etc.  

Code :
  1. struct int_amelioré : public int
  2. {
  3. /*marche pô!*/
  4. }


 
Cordialement,
   xter.


Message édité par xterminhate le 23-04-2004 à 01:36:23

---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 23-04-2004 à 01:36:00   

Reply

Marsh Posté le 23-04-2004 à 03:07:08    

je vais pitètre me faire taper sur les doigts par Taz à un moment donné, mais déjà 'class' à la place de 'struct' c'est mieux dériver une classe :D
 
ensuite pour le surchargage des types de base c'est mort, fo que tu fasse une classe qui comporte le type comme membre privé et des opérateurs de cast pour rendre le bestiaux +ou- transparent. (donc template aussi)
 
pour tes constructeurs, vector<> attends plus de paramètres de template, si tu déclares les même paramètres avec les mêmes valeurs par défaut pour ta template vector_ameliore ce sera mieux...
 
à priori vi t'es obligé de faire les constructeurs :/
 
mais là Taz pourra me corriger là dessus (flageller)...


Message édité par bjone le 23-04-2004 à 03:17:55
Reply

Marsh Posté le 23-04-2004 à 03:19:19    

Les constructeurs ne sont jamais hérités, pour une raison simple (syntaxe approximative) :

Code :
  1. class A {
  2. private :
  3.   int ma;
  4. public :
  5.   A():ma(10) {};
  6. }
  7. class B : A {
  8. private :
  9.   Zorglub &mb;
  10. }


 
maintenant, si B héritait du constructeur de A, que vaudrait  mb après construction ? il n'a pas le droit d'être nul (donc une valeur par défaut n'existe intrinsèquement pas), et il n'a pas été défini.
 
De même, pour les types pour lesquels une valeur par défaut existe intrinsèquement, il n'y a aucune raison qu'elle soit valide dans l'objet (style un int qiu va se retrouver sous une fraction, on a jamais intérêt à avoir zéro dedans), donc on ne doit pas lui donner dans le dos de l'utilisateur.
 
donc les langages à la C++ (C++, java, C# au moins) n'héritent jamais des constructeurs.


Message édité par nraynaud le 23-04-2004 à 03:20:03

---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 23-04-2004 à 07:17:42    

faut hériter de vector public, son destructeur est pas virtuel, problème en vue. STL est pas faite pour ça, je déconseille. après il est claire que t'as jamais vu un truc STL, avant de faire n'importe quoi, tu ferais bien de sérieusement étudié l'interface de std::vector ... juste comme ça tu m'améliores en quoi ?

Reply

Marsh Posté le 23-04-2004 à 08:08:00    

A la base j'ai un programme qui manipule bcp de vector<T> (avec T perso basé sur un enum, mais peu importe). Dans mon programme, j'ai donc tout un ensemble de fonctions et procédures qui prennent en argument un (ou plusieurs) vector<T> et réalisent un traitement.
 
Je me demandais s'il n'etait pas possible d'en faire une classe à part entière, tout en conservant l'interface standard de vector.
 
Effectivement, c'est peut etre pas une bonne idée. Ou alors c'est au prix de perdre l'interface de vector et de créer une interface spécifique.  
 
Cordialement,
   Xter.


Message édité par xterminhate le 23-04-2004 à 08:23:26

---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 23-04-2004 à 08:10:16    

nraynaud >> ok pour ton exemple, mais je suis dans la cas complètement inverse. Je fournis au constructeur les arguments du/des constructeur(s) de vector. Je suis donc obligé d'écrire un par un des constructeurs et destructeur quasiment vides (sous forme d'une simple "passerelle" vers ceux de vector).
 
Cordialement,
   Xter.


Message édité par xterminhate le 23-04-2004 à 08:13:29

---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 23-04-2004 à 08:21:27    

bjone a écrit :

ensuite pour la surchargage des types de base c'est mort, fo que tu fasse une classe qui comporte le type comme membre privé et des opérateurs de cast pour rendre le bestiaux +ou- transparent. (donc template aussi)


 
Je sais bien, mais je cherche une autre solution. Sinon, l'exercice n'est pas ininteressant (réécrire tous les opérateurs) mais je trouve ca un peu lourd comme code ;)
 
Cordialement,
   xter.


Message édité par xterminhate le 23-04-2004 à 08:22:15

---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 23-04-2004 à 09:49:52    

Il ne s'agit pas de réécrire tous les opérateurs, mais seulement leur interface, leur implémentation se contentant de déléguer le boulot a vector

Reply

Marsh Posté le 23-04-2004 à 12:57:26    

Bien entendu :)


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 23-04-2004 à 13:00:03    

xterminhate a écrit :

A la base j'ai un programme qui manipule bcp de vector<T> (avec T perso basé sur un enum, mais peu importe). Dans mon programme, j'ai donc tout un ensemble de fonctions et procédures qui prennent en argument un (ou plusieurs) vector<T> et réalisent un traitement.
 
Je me demandais s'il n'etait pas possible d'en faire une classe à part entière, tout en conservant l'interface standard de vector.
 
Effectivement, c'est peut etre pas une bonne idée. Ou alors c'est au prix de perdre l'interface de vector et de créer une interface spécifique.  
 
Cordialement,
   Xter.

mais t'en as besoin pourquoi ? si tu rajoutes rien ...

Reply

Marsh Posté le 23-04-2004 à 13:00:03   

Reply

Marsh Posté le 23-04-2004 à 13:07:08    

J'ajoute entre autres une fonction Serialize spécifique.
 
Au lieu de faire un appel de fonction classique...

Code :
  1. std::string Serialize( std::vector<T> )) {/**/}


 
...je preferais encapsuler par

Code :
  1. std::string std::vector_ameliore::Serialize() {/**/}


 
Tu comprends ?
 
Xter.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 23-04-2004 à 13:08:39    

t'as faire un operator ou un truc comme ça ... mais bon là c'est pas méchant 2 fonctions, c'est pas grave, surtout que je vois une classe Serializer avec 2 fonctions membres

Reply

Marsh Posté le 23-04-2004 à 13:11:51    

C'est clair, je me prends la tete pour pas grand chose finalement. D'ailleurs, mes idées apres 1h du mat' sont souvent pourris, la preuve ! :)
 
Cordialement,
 Xter.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 23-04-2004 à 13:12:32    

le vrai problème n'étant jamais le constructeur, mais le type de données contenu

Reply

Sujets relatifs:

Leave a Replay

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