En Objective C, le langage a intégré la prise en charge de la délégation de classes à d'autres classes. C++ n'a pas cette fonctionnalité (une classe en tant que délégué d'une autre classe) en tant que partie du langage. Une façon d'imiter qui est de séparer la déclaration et la mise en œuvre de cette façon:Comment implémenter "délégation" pour les classes efficacement en C++?
Dans le fichier d'en-tête ah:
class AImpl;
class A
{
public:
A();
void f1();
int f2(int a, int b);
// A's other methods...
private:
AImpl *mImpl;
};
Dans le Cpp (fichier de mise en œuvre):
#include "a.h"
class AImpl
{
public:
AImpl();
// repeating the same method declarations from A
void f1();
int f2(int a, int b);
// AImpl's other methods
};
AImpl::AImpl()
{
}
void AImpl:f1()
{
// actual implemetation
}
int AImpl::f2(int a, int b)
{
// actual implmentation
}
// AImpl's other methods implementation
A::A()
{
mImpl = new AImpl();
}
// A's "forwarder"
void A::f1()
{
mImpl->f1();
}
int A::f2(int a, int b)
{
return mImpl->f2(a, b);
}
// etc.
Cela nécessite de créer manuellement toutes les fonctions "redirecteur" de la classe qui délégueraient à une autre classe pour effectuer le travail en cours. Tardif, c'est le moins qu'on puisse dire.
La question est: existe-t-il un mieux ou un moyen plus productif pour réaliser cet effet en utilisant des modèles ou d'autres constructions de langage C++?
Au lieu de tout cela forwarding vous pouvez simplement déclarer une interface pure dans l'en-tête, ainsi que la déclaration d'une fonction d'usine. Dans le fichier d'implémentation une classe implémentant l'interface, et implémentation de l'usine. En supposant que ce n'est pas l'intention que le code client devrait être capable d'étendre la classe de façon significative. –
Je ne pense pas qu'il y en ait mais j'attendrai quelqu'un plus compétent que moi pour me corriger. –
J'étais sur le point d'écrire une liste complète sur la façon de déléguer la fonction en C++, mais j'ai trouvé que quelqu'un l'avait déjà fait: http://stackoverflow.com/questions/9568150/what-is-ac-delegate vote pour fermer en double –