C++ - Programmation
Marsh Posté le 18-05-2001 à 14:27:42
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.
Marsh Posté le 18-05-2001 à 14:42:01
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 ?
Marsh Posté le 18-05-2001 à 14:54:32
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]
Marsh Posté le 18-05-2001 à 14:56:15
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 :
|
Je suis curieux de connaitre une manière moins horrible (sans le dynamic_cast) mais là, je suis un peu fatigué :-)
Marsh Posté le 18-05-2001 à 14:59:39
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...
Marsh Posté le 18-05-2001 à 15:01:38
bien sûr, il faut ajouter les catch pour les erreur de cast etc...
Marsh Posté le 18-05-2001 à 15:02:04
return new B(*this);
Mais bon il faut implementer la methode dans toutes les classes, et il y a du boulot...
Marsh Posté le 18-05-2001 à 15:13:05
j'ai cherché trop compliqué en fait ce que je voulais dire :
Code :
|
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)
Marsh Posté le 18-05-2001 à 15:18:20
n0mad a écrit a écrit : j'ai cherché trop compliqué en fait ce que je voulais dire :
|
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 ?
Je sais, je suis chiante, mais c'est pas ma faute a moi ...
Marsh Posté le 18-05-2001 à 15:33:41
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 ? ![]() 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 ?
Marsh Posté le 18-05-2001 à 15:39:50
Dans le cas present, je dirais plutot une erreur de marketing
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...
Dans un premier temps je m'occupe d'Oracle, une fois qu'il sera satisfait... on verra pour le client...
Marsh Posté le 18-05-2001 à 15:53:59
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
Marsh Posté le 18-05-2001 à 16:03:46
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.)
Marsh Posté le 18-05-2001 à 16:17:14
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...
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++
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
Marsh Posté le 18-05-2001 à 14:09:26
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