Alternative à c++ statique méthodes virtuelles

En C++ n'est pas possible de déclarer une statique de la fonction virtuelle, ni jeter un non-statique de la fonction pour un style C pointeur de fonction.

Maintenant, j'ai une plaine ol' C SDK qui utilise des pointeurs de fonction fortement.

Je dois remplir une structure avec plusieurs pointeurs de fonction. J'avais l'intention d'utiliser une classe abstraite avec un tas de statique des méthodes virtuelles pures, et les redéfinir dans les classes dérivées et de remplir la structure avec eux. Il n'était pas jusque-là que j'ai réalisé que virtuel statique ne sont pas autorisés en C++.

Aussi ce C Sdk signature de fonction n'ont pas de userData param.

Est-il une bonne alternative? Le mieux je pense est de définir certaines des méthodes virtuelles pures GetFuncA(), GetFuncB(),... et de quelques membres statiques (FuncA()/FuncB() dans chaque classe dérivée, ce qui serait retourné par la GetFuncX(). Ensuite, une fonction dans la classe abstraite pourrait appeler ces fonctions pour obtenir les pointeurs et remplir la structure.

Modifier
Répondre à Jean Dibling, il serait bon d'être en mesure de le faire:

class Base
{
    FillPointers() { myStruct.funA = myFunA; myStruct.funB = myFunB; ...}
private:
    CStruct myStruct;
    static virtual myFunA(...) = 0;
    static virtual myFunB(...) = 0;
};

class Derived1 : public Base
{
    Derived1() {  FillPointers();  }
    static virtual myFunA(...) {...};
    static virtual myFunB(...) {...};
};

class Derived2 : public Base
{
    Derived2() {  FillPointers();  }
    static virtual myFunA(...) {...};
    static virtual myFunB(...) {...};
};

int main()
{
    Derived1 d1;
    Derived2 d2;
    //Now I have two objects with different functionality
}
  • Il y a une bonne raison statique des fonctions virtuelles ne sont pas autorisés. Si vous avez une classe qui contient des fonctions virtuelles pures, il devient abstrait. Une classe abstraite ne peut pas être instanciée, donc il n'y a pas de risque de ces fonctions appelées. Toutefois, si vous permettez statique virtuals, ils pourraient être appelés à partir de la classe avec son instanciation. Il n'y aurait rien pour les empêcher d'être appelée avant qu'ils ont été définis!
  • L'idée d'un static fonction est directement opposée à l'idée d'une pure virtual fonction. Peut-être que si vous l'avez expliqué ce que vous cherchiez à atteindre plutôt que la façon dont vous étiez en train de la réaliser, nous pourrions vous donner de meilleurs conseils.
  • Le C SDK passer un contexte pointeur de fonctions? Sinon, avez-vous seulement besoin d'avoir un gestionnaire d'actif à un moment?
  • Pouvez-vous poster le code que vous souhaitez écrire, mais ne peut pas car il n'y a pas une telle chose comme un static virtual?
  • Simple: initialiser les pointeurs dans les classes dérivées' CTors. Ce n'est pas vraiment beaucoup de code supplémentaire.
  • Je n'ai pas l'obtenir. Ce que vous avez posté est juste plain ol' des fonctions virtuelles. Supprimer la static mot-clé et tout doit être beau. Je suis absent pourquoi vous pensez que vous avez besoin static?
  • FillPointers() { myStruct.funA = myFunA; myStruct.funB = myFunB; ...} Ce qui ne compile pas moins que myFunA et myfunB sont statiques.
  • Dibling - les méthodes virtuelles sont censés être appelée par du code C. C ne peut pas appeler C++ méthodes virtuelles, mais il peut appeler des méthodes statiques.
  • Résolu. Quelqu'un a posté quelque chose sur les PFI, mais avant, j'ai réussi à lire attentivement elle j'ai mis à jour la page et il a été supprimé. Toutefois, la wikipédia m'a donné les détails manquants. Maintenant, je me demande quelle réponse dois-je accepter -_-
  • Poster une réponse avec un lien vers l'article de Wikipedia sur la PFI et accepter votre propre réponse si vous pensez que c'est le meilleur...
  • Err .. je ne vois pas ce que le PROGRAMME a à faire avec des fonctions virtuelles. L'curieusement récurrents pattern template est sur le moment de la compilation polymorphisme , pas de polymorphisme d'exécution.
  • Oneal - Vous avez raison. PFI n'a rien à voir avec les fonctions virtuelles, mais depuis que les fonctions virtuelles peuvent pas être utilisés comme C rappels, et la question porte spécifiquement à l'aide de méthodes C++ que le C rappels, il est tout à fait approprié ici.
  • Eh bien, fonctions membres statiques ne peuvent pas être de façon portable utilisé en tant que C-rappels soit.
  • Oui, vous avez raison.
  • des fonctions virtuelles pures sont un moyen d'obliger les descendants de fournir certaines choses pour la classe de base à utiliser. Depuis des fonctions virtuelles ne peuvent pas travailler dans ce cas, on peut utiliser une autre technique pour forcer les descendants de fournir certaines caractéristiques, à savoir, les PFI. Ma réponse démontre que. Je n'avais pas remarqué le supprimé de réponse quand j'ai posté le mien, mais je pense que ma réponse ne correspond mieux à démontrer dans le contexte de cette question, de toute façon (pas de conversion de type requis, et il construit une structure comme celle la C code exige).
  • Peut-on m'expliquer ce qu': ol' signifie?
  • C'est une autre façon d'écrire "vieux".

InformationsquelleAutor raven | 2010-04-27