En passant membre de pointeur de fonction de membre de l'objet en c++
J'ai un problème avec l'aide d'un pointeur de fonction en C++. Voici mon exemple:
#include <iostream>
using namespace std;
class bar
{
public:
void (*funcP)();
};
class foo
{
public:
bar myBar;
void hello(){cout << "hello" << endl;};
};
void byebye()
{
cout << "bye" << endl;
}
int main()
{
foo testFoo;
testFoo.myBar.funcP = &byebye; //OK
testFoo.myBar.funcP = &testFoo.hello; //ERROR
return 0;
}
Compilateur renvoie une erreur à testFoo.myBar.funcP = &testFoo.hello;
:
ISO C++ forbids de prendre l'adresse d'un membre lié fonction permettant de former un
pointeur de fonction membre. Dire
"&foo::hello'impossible de convertir de 'void (foo::)()' de 'void ()()' attribution
Alors j'ai essayé comme ceci:
class bar
{
public:
void (*foo::funcP)();
};
Mais maintenant, le compilateur ajoute un de plus:
'foo' n'a pas été déclaré
Est-il un moyen de le faire fonctionner?
Merci d'avance pour les suggestions
Vous devez vous connecter pour publier un commentaire.
Prenant chacun suggestions ensemble, votre solution finale ressemblera à:
La C++ FAQ Lite a quelques conseils sur la façon de simplifier la syntaxe.
La prise de Chris' idée et de l'utiliser, vous pourriez faire vous-même quelque chose comme ceci:
bar
pour définir à la fois des pointeurs vers0
. Vous pouvez configurer la classe afin de toujours, a un seul ensemble de membres (c'est à dire le réglage de l'un des membres0
s l'autre), puis en ajouter uneoperator()
fonction qui appelle l'ensemble des membres. Mais ça va être plus compliqué que celui de la fin.Que le message d'erreur indique, les méthodes appartiennent à la classe, et non pas à des instances individuelles. Pour cette raison, les pointeurs de fonctions libres et des pointeurs vers des non-méthodes statiques sont des choses complètement différentes. Vous aurez également besoin d'une instance à l'appel de la méthode sur.
Vous pouvez utiliser des bibliothèques comme Coup de pouce.Lier et Coup de pouce.La fonction (aussi dans le std::tr1 je pense) de faire abstraction de la différence et aussi lier un exemple de la méthode:
Pour faire de votre deuxième option travail, déclarer foo ainsi, le compilateur sait que c'est une classe.
Notez également que votre pointeur de fonction syntaxe est incorrecte. Le
*
vient juste avant le nom de la variable:avant foo déclaration à l'avant de la barre: