Je voudrais écrire un groupe de classe D_I (alias I = 1,2, ... juste que je veux dire '_I' être le nom propre à la classe, pas entier) qui gère certaines opérations (booléennes, par exemple) F avec la même signification pour toutes les classes. Mais aussi je veux opérer avec des "sommes" d'objet de telles classes, différentes classes du groupe pourraient être "ajoutées" ensemble. L'opération mentionnée de la somme de cet objet dépend du fonctionnement correspondant des objets ajoutés.C++ Problème avec le code opérateur inheritage: ai-je besoin de copier le même code pour toutes les classes dérivées?
Voilà pourquoi je vais créer la classe de base B commun pour gérer le fonctionnement de « sommation »:
class B
{public:
B(): LEFT(NULL), RIGHT(NULL) {};
B (const SpBrd& S);
B (const B& A, const B B);
~B();
{if (LEFT != NULL) delete LEFT; // NULL if it is default B or D_I
if (RIGHT != NULL) delete RIGHT; // NULL if it is default B or D_I
}
B operator + (const B& S) const;
bool F(const Point& P) const;
{bool b = aF(P);
if (LEFT != NULL) b = b && LEFT->F(P); // this is how F depends
if (RIGHT != NULL) b = b && RIGHT->F(P); // of added classes
}
protected:
virtual bool aF(const Point& P) const {return true;}; // Default!
B* LEFT; // Pointer to left operand of "sum"
B* RIGHT; // Pointer to right operand of "sum"
// (since it might point to D_i class too as well)
};
donc cette façon dérivée classe D est facile à écrire, car il ne devrait gérer son constructeur et aF :
class D_I: public B
{public:
D() {...};
protected:
virtual bool aF (const Point& P) const
{// return something here
}
};
Le problème est le suivant: COMMENT ÉCRIRE opérateur + et constructeur de copie de la classe B:
B:B (const B& S)
{if (S.LEFT != NULL) LEFT = new B (S.LEFT)
if (S.RIGHT != NULL) RIGHT = new B (S.RIGHT)
};
B B:operator + (const B& S) const
{SpBrd S;
S.LEFT = new B (*this);
S.RIGHT = new B (S);
};
ne produirait pas de résultat correct parce que 'new B ...' devrait être remplacé par 'new D_I ...' si 'this', 'S' dans 'operator +' ou 'S.LEFT' ou 'S .RIGHT 'dans le constructeur de copie ne fait pas référence à un objet de classe B exactement mais à un objet de classe D_I. Donc, je ne peux pas trouver un moyen de rendre B :: operator + savoir de quelles sources de somme il s'agit car il pourrait y avoir une grande quantité de D_I et ils seront ajoutés de temps en temps. Que dois-je faire pour écrire tout cela correctement?
Je ne peux pas écrire des parties de l'opérateur D_I + (D_J) et D_I :: D_I (const D_J) pour toutes les paires de (D_I, D_J), ce n'est pas juste! (Cela représenterait quelque chose comme des frontières (surface) dans l'espace.La fonction F représente être à l'intérieur de la frontière - c'est-à-dire pour vérifier si le point est à l'intérieur d'un corps spatial. (opérateur +) des corps spatiaux à l'intérieur des deux autres bordures Exemples: intersection de deux bordures de sphères - zones intérieure et extérieure - produit une coquille sphérique appelée anneau 3D, peut aussi revoir la bordure sphérique d'intersection avec rayon R et angle solide de 10 * 10 degrés autour de pôles et ainsi de suite)
Excuse StackOverflow pour ne pas respecter mes sauts de paragraphe, mais nonless: Qu'est-ce que 'SpBrd'? L'opérateur + en bas n'a pas de sens syntaxique. 'classe B' ne compilera même pas dans ma tête parce que ses noms de cteurs et de dtor sont faux. Aussi, pensez à reformuler votre question. Ce n'est pas clair: "Classe de groupe"? Évitez la voix passive. Peu importe comment j'essaie de le lire, "1) dans l'opérateur + si * this et S ne sont pas B mais un de D_I devrait être" new D_I "ne me lit même pas comme une phrase anglaise correcte. Idem pour le point 2). Je vais m'arrêter ici. – wilhelmtell
Oh, mon Dieu, je suis vraiment désolé ... En posant cette question, j'ai juste pris un fragment de mon programme en supprimant des fonctions supplémentaires, et en changeant les noms de classes comme SpBrd et SphBrd en Base et Dériver (B et D en abrégé) pour ne pas confondre les lecteurs, mais il est tout à fait le contraire ... J'ai aussi paraphrasé ce paragraphe. Encore pardon. – Nick
J'ai mis à jour ma réponse. Je pense que cela répond à la question que vous posez maintenant, même si je suis encore un peu perplexe à ce sujet. – Omnifarious