1

pouet,

Alors, j'ai du mal à comprendre mon problème, et encore plus à mettre en place un workaround simple. Donc je vais vous expliquer ce que j'essaye de faire, et vous me direz ce qui se passe exactement grin

J'ai une classe Classe, qui contient un pointeur vers une Interface. De cette interface dérivent des DérivésdInterface, qui implémentent toutes les méthodes de l'interface.

Ce que je n'arrive pas à faire, c'est à écrire le constructeur de copie de Classe, parce que je ne sais pas comment faire une recopie profonde d'une classe dérivée d'une interface sad

Ca donne ça :
classe.hpp
#include "interface.hpp" class Classe { public Classe(); Classe(const Classe& classe); private: Interface* interface; };

Et ça donne :
classe.cpp
#include "classe.hpp" #include "deriveedinterface_1.hpp" #include "deriveedinterface_2.hpp" #include "..." Classe::Classe(): interface(nullptr) {} Classe::Classe(const Classe& classe): membre1(classe.getMembre1), membre2(classe.getMembre2), .... interface(classe.??????????????????????????????) { ... }


J'ai eu l'idée (apparemment mauvaise ^^) de créer un "constructeur de copie virtuel" pour l'interface, qui se serait démerdé pour appeler le bon constructeur de copie, mais c'est interdit.
J'ai essayé d'ajouter une méthode copy() à DérivédInterface, mais j'ai des membres à copier dans l'interface, et dans ses dérivés, et j'arrive pas à faire un truc de propre sans getters qui exposent la totalité des membres privés de l'interface, bref c'et dégueulasse.

Donc voilà, je sais pas comment m'y prendre dans ce cas de figure, quelle est la bonne façon de procéder.

Merci d'avance pour vos lumières. ^^

2

http://www.developpez.net/forums/d829603/c-cpp/cpp/constructeur-copie-classe-abstraite/ semble répondre à ton pb ?

Perso, pour les copies en profondeur, sauf indication contraire (perf extrême, etc, mais dans ce cas, faut éviter les copies de toute façon embarrassed), je ne me casse plus : sérialisation suivie d'une désérialisation. Deux lignes, et c'est définitivement plié. Je ne sais pas si Qt est suffisamment malin pour faire ça proprement, sans être trop intrusif dans ton code (héritage de QVariant apparemment). Mais je t'encourage à jeter un oeil.

3

Ok merci, la réponse est là : http://cpp.developpez.com/faq/cpp/?page=Les-classes-en-Cplusplus#Comment-effectuer-la-copie-d-objets-polymorphes
J'y étais presque, cf
Folco (./1) :
J'ai essayé d'ajouter une méthode copy() à DérivédInterface, mais j'ai des membres à copier dans l'interface

J'ai juste pas pensé à faire un new et à renvoyer le pointeur, tout simplement, j'ai voulu bricoler à la mano comme un con couic

Merci Pen^2 ! Tu sais que tu pourrais être développeur pro ?? !!!!!!

4

grin
Pour spécifier le type de retour de la classe dérivée par contre je crois que c'est mort avec les compilateurs usuels. Pas certain. Tu nous dira cheeky

5

Ah bon ? Les "covariant return types" ? J'arrive pas à accéder au site de gcc, mais ça m'a l'air tout à fait trivial, non ?

6

Le concept est intuitif, mais justement... C'est du C++, quoi cheeky

7

g++ gère les retours covariants depuis 2002.

Et oui, une méthode virtuelle clone est la bonne solution. Je conseille d'ailleurs d'appeler la méthode clone plutôt que copy. Le nom clone est le nom utilisé dans Qt et ailleurs (Java, par exemple).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

8

Merci !

9

Bon, ben Pen², toi qui voulait être sur, ça marche impeccable :
La méthode clone :StorageLocal* StorageLocal::clone() const { return new StorageLocal(*this); }
et le constructeur de copie :StorageLocal::StorageLocal(const StorageLocal& storage): Storage(storage.getVersion(), storage.getLocation()), file(storage.getLocation()) { }
Comme quoi, c'est vraiment trivial, j'étais à deux doigts mais j'ai pas su faire sad

10

(merci ^^)