Chaque objet de .NET hérite (directement ou indirectement) de la base racine commune "objet". Y a-t-il une racine d'objet aussi courante en C ++? Comment puis-je passer tout objet em> à une fonction? EDIT: Pour clarifier, le but: Dans cette fonction, je souhaite appeler un pointeur à la fonction membre. Pour cela, j'ai besoin de l'instance d'objet et du pointeur sur la fonction requise. Pour simplifier la lisibilité, je veux faire une emballage contenant les deux informations requises. Je ne sais pas si c'est le meilleur moyen, mais c'est l'idée de fond. P> p>
7 Réponses :
Désolé - il n'y a pas d'objet de base racine en C ++. Mais vous pouvez définir la vôtre pour toutes vos classes. p>
Mais il y a peu de raisons de le faire.
Il n'y a pas de classe racine commune. Utilisez soit Void * pour transmettre n'importe quel objet dans une fonction, ou mieux définir une certaine classe de base. P>
C'est correct, alors je ne vais pas descendre, mais recommander void * code> n'est guère une bonne recommandation.
Je dirais que c'est correct de recommander annuler * lorsque le but est d'obtenir un équivalent d'objet. Le but est plus défectueux que la solution.
Il n'y a pas de classe de base commune; Mais en utilisant un quelque chose comme Boost :: Tout ou plus généralement une approche basée sur des gabarits est préférable sur un vide *. P>
pour cela, j'ai besoin de l'instance d'objet et du pointeur sur la fonction requise. em> p> blockQuote>
Cela ressemble beaucoup à des "délégués". Tout d'abord, vous devrez définitivement définir une classe de base commune pour tous les objets que vous souhaitez appeler. En C ++, vous pouvez utiliser plusieurs héritages si l'objet appartient déjà à une autre hiérarchie. P>
a ensuite lu sur Fonctions membres et les délégués C ++ les plus rapides qui est un excellent article approfondi sur le thème des délégués (qui constituent un pointeur de fonction d'objet et de membre lié ensemble). En utilisant le fichier d'en-tête décrit dans cet article, vous pouvez créer des délégués et les appeler facilement comme des pointeurs de fonction réguliers. P>
Il n'y a pas de classe de base commune en C ++. Cependant, il existe déjà des bibliothèques qui vous permettent d'appeler des fonctions membres en tant que délégués. Vous pouvez essayer d'utiliser Boost :: Fonction ensemble avec boost :: lid ou
Les fonctions de modèle sont présentes et évitent la nécessité d'un tel parent racine de toutes les classes.
template <class T>
void DoSomeStuff(T const &t) {
// Do the stuff with t...
t.callTheFunction();
}
Vous ne pouvez pas utiliser dosomestuff (t const & t) code> en tant que fonction membre, cependant. C'est-à-dire que vous ne pouvez pas l'appeler comme ceci: t.dosomestuff () code>. Une classe de base racine vous permettrait de le faire. Sinon, cela pourrait être fait en écrivant un opérateur de points génériques, mais pour l'instant, surcharger l'opérateur DOT n'est pas possible en C ++.
Bien sur, c'est possible. Cependant, tous vos objets hériter d'une classe de base racine crée un couplage inutile dans votre code source. C'est IMHO ne vaut pas le commerce pour le t. Code> sucre syntaxique.
Vous dépendez au moins d'un minimum d'exécution C ++ s'il y avait un objet racine implémenté en C ++. Ceci est parfois indésirable. P>
Puis-je vous demander ce que vous allez faire avec cet objet pleinement générique?
Merci à tous ceux qui ont donné des idées précieuses. Je pensais également à des modèles, mais la classe qui utilise ce wrapper de modèle devrait connaître le paramètre de modèle correct -> Ne doit pas nécessairement de ne pas le type de compilation. Terry Mahaffey suggère d'utiliser Boost :: Toutefois, mais cela apporte la dépendance à la bibliothèque de Boost (si longtemps en utilisant uniquement la bibliothèque standard). Mon bon ami m'a aussi rappelé que, à Java, il n'y a pas de concept de délégués (ce que c'est tout à propos de) non plus. La conception est résolue avec des interfaces à la place. Avec ce rappel, j'ai compris que c'est probablement la meilleure solution dans mon cas.