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

 


Dernière réponse
Sujet : C++
BENB Il n'y a pas qu'un probleme de plate-forme, mon code doit compiler pour plusieurs versions de compilos (aCC et cfront) or cfront est un vieux compilo C++ qui est incapable de compiler du code utilisant la STL, des exceptions, des templates trops lourds, ou du RTTI... :D
 
Ca a deja ete l'objet d'une joute amicale avec Verdoux et d'autres sur l'utilisation de la STL, par les vrais programmeurs(es) C++ :sweat:
 
Mais bon a force de copier colle, j'arrive au bout de tout cela, il faut encore que je surcharge les operator= pour palier au fait que l'on ne puisse faire des trucs du type new toto[5](titi)
et puis... ouf, me poser pour me reposer :D

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
BENB Il n'y a pas qu'un probleme de plate-forme, mon code doit compiler pour plusieurs versions de compilos (aCC et cfront) or cfront est un vieux compilo C++ qui est incapable de compiler du code utilisant la STL, des exceptions, des templates trops lourds, ou du RTTI... :D
 
Ca a deja ete l'objet d'une joute amicale avec Verdoux et d'autres sur l'utilisation de la STL, par les vrais programmeurs(es) C++ :sweat:
 
Mais bon a force de copier colle, j'arrive au bout de tout cela, il faut encore que je surcharge les operator= pour palier au fait que l'on ne puisse faire des trucs du type new toto[5](titi)
et puis... ouf, me poser pour me reposer :D
wpk en fait, tu peux utiliser les RTTI sur toutes les platformes c'est dans la STL.
Si t'as pas envie de te faire chier, tu peux bricoler a la mano une vtable dans le constructeur en utilsant justement ces infos de rtti. C'est hyper mega super crade (un super switch sur le type) je te l'accorde mais ca te permettra de construire des objets sans connaitre forcement le type (les DECLARES_DYNAMIQUE de sieur bilou doivent faire plus ou moins la meme chose je crois.)
BENB Arrgh!!!
Et en plus on ne peut pas faire un tableau et utiliser des constructeurs avec des initialiseurs... avec new...
 
Mais pourquoi suis-je montee dans cette galere :D
BENB Dans le cas present, je dirais plutot une erreur de marketing :D
Il n'avait jamais ete prevu de faire cela !
 
Et en fait je suis bien avencee, parce que en admettant que ca marche je ne sais pas comment je vais passer ce resultat au module appelant, qui lui aussi n'a jamais envisage que le resultat ne soit pas un scalaire... :D
 
Dans un premier temps je m'occupe d'Oracle, une fois qu'il sera satisfait... on verra pour le client...
n0mad

BENB a écrit a écrit :

 
 
Je ne suis pas en position de dire "Vade-Retro"
Mais connais-tu un bonne implementation des MFC sur HP-UX (Unix de HP) et qui compile a la fois sous aCC et cfront ? :D
 
Je sais, je suis chiante, mais c'est pas ma faute a moi ...




 
Arfff, y avait pas la plateforme précisée, je me suis dit que c'était sous l'OS à Bilou. Tant pis (ou tant mieux : à bas les RTTI ! :) )
 
Maintenant, je pose une question d'ordre général (parce que ça m'est arrivé plus d'une fois) : Quand on arrive sur ce genre de problème, est-ce qu'on aurait pas commis par hasard une erreur de conception ?

BENB

n0mad a écrit a écrit :

j'ai cherché trop compliqué en fait ce que je voulais dire :
 

Code :
  1. //virtual
  2. A* B::createCopy() {
  3.     return new B(*this);
  4. }


 
En fait, on se retrouve avec un problème classique qui revient souvent : le "constructeur virtuel".  
 
Sinon, peut être que tu vas me dire "Vade Retro" :) mais il y a les DECLARE_DYNAMIC des MFC qui peuvent rendre ce genre de services (perso, j'utilise pas, je deteste le RTTI)




 
Je ne suis pas en position de dire "Vade-Retro"
Mais connais-tu un bonne implementation des MFC sur HP-UX (Unix de HP) et qui compile a la fois sous aCC et cfront ? :D
 
Je sais, je suis chiante, mais c'est pas ma faute a moi ...

n0mad j'ai cherché trop compliqué en fait ce que je voulais dire :
 

Code :
  1. //virtual
  2. A* B::createCopy() {
  3.     return new B(*this);
  4. }


 
En fait, on se retrouve avec un problème classique qui revient souvent : le "constructeur virtuel".  
 
Sinon, peut être que tu vas me dire "Vade Retro" :) mais il y a les DECLARE_DYNAMIC des MFC qui peuvent rendre ce genre de services (perso, j'utilise pas, je deteste le RTTI)

BENB return new B(*this);
 
Mais bon il faut implementer la methode dans toutes les classes, et il y a du boulot...
n0mad bien sûr, il faut ajouter les catch pour les erreur de cast etc... :D
BENB Verdoux > c'est ce que je crains, et pourtant il suffirait appler le constructeur de copie de B...
 
en fait je suis en train d'ajouter un methode copyof dans A et les objets derivees, mais bon il y en a une tripotee...
n0mad Je suis pas sûr de tout avoir saisi, mais en définitive, tu veux obtenir une copie (ou n copies, le problème est identique) à partir d'une instance d'une des sous-classes de A (ici B) alors que tu as un pointeur de type A*, c'est ça ?
 
Dans ce cas là, je pense qu'il te faut une méthode virtuelle de copie déclarée dans A et implémentée dans les sous-classes de A.
 
Donc un truc dans ce genre résoudrait le problème :

Code :
  1. //virtual
  2. A* B::createCopy(A* a) {
  3.     return new B(dynamic_cast<B*>(a));
  4. }


 
Je suis curieux de connaitre une manière moins horrible (sans le dynamic_cast) mais là, je suis un peu fatigué :-)

verdoux Je pense que c'est pas possible. Comment veux tu allouer de la place pour des objets dont tu ne sais rien si en plus tu ne peux pas utiliser la factory.

 

[edit]--Message édité par Verdoux--[/edit]

BENB

wpk a écrit a écrit :

Si j'ai bien compris A* Afactory(const B &) te renovoie un B *
caste en A*.
si c'est le cas tu peux faire ca
 
 
A **array=new (A *)[n];
for (int i=0;i<n;i++)
{
 A[i]=Afactory(toto);
}
 
Ps: j'ai pas de compilo c++ sous la main donc je peux pas garantir que ca marche.




 
Alors non je ne peut pas... en fait je suis dans ce putain de call-back oracle...
 
j'ai un pointeur sur A qui pointe sur B... et la je me rends compte que il m'en faut n... (c'etait pas prevu a l'origine)
mais je ne sais plus comment B a ete construit (Afactory le determine a partir d'une chaine de caracteres, qui bouff est morte depuis longtemps) Donc mon idee c'est de faire pointer A sur un tableau de B, mais comment creer ce tableau ?

wpk Si j'ai bien compris A* Afactory(const B &) te renovoie un B *
caste en A*.
si c'est le cas tu peux faire ca
 
 
A **array=new (A *)[n];
for (int i=0;i<n;i++)
{
 A[i]=Afactory(toto);
}
 
Ps: j'ai pas de compilo c++ sous la main donc je peux pas garantir que ca marche.
BENB J'ai un trou la...
 
A est une classe abstraite,
 
B est une des classes qui derivent de A mais je ne sais pas laquelle, B a un constructeur de copie.
 
je veux a partir de B creer un tableau de n elements copie de B
 
 
A* Afactory(void);
 
A *B = Afactory(toto); // Attention B est d'un type derive de A
 
-------------------------
 
A *array = new A(*B)[n] ne marche bien sur pas :D

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)