pointeurs de fonction générer des "non valide l'utilisation de la non-fonction membre statique' erreur
Je suis en train de saisir pointeur de fonction d'un concept dans une meilleure façon. J'ai donc un de très simple et de travail exemple:
#include <iostream>
using namespace std;
int add(int first, int second)
{
return first + second;
}
int subtract(int first, int second)
{
return first - second;
}
int operation(int first, int second, int (*functocall)(int, int))
{
return (*functocall)(first, second);
}
int main()
{
int a, b;
int (*plus)(int, int);
int (*minus)(int, int);
plus = &add;
minus = &subtract;
a = operation(7, 5, add);
b = operation(20, a, minus);
cout << "a = " << a << " and b = " << b << endl;
return 0;
}
So far So good,
Maintenant, j'ai besoin de regrouper les fonctions dans une classe, puis sélectionnez ajouter ou soustraire basé sur le pointeur de fonction que j'utilise. Donc, je viens de faire une petite modification:
#include <iostream>
using namespace std;
class A
{
public:
int add(int first, int second)
{
return first + second;
}
int subtract(int first, int second)
{
return first - second;
}
int operation(int first, int second, int (*functocall)(int, int))
{
return (*functocall)(first, second);
}
};
int main()
{
int a, b;
A a_plus, a_minus;
int (*plus)(int, int) = A::add;
int (*minus)(int, int) = A::subtract;
a = a_plus.operation(7, 5, plus);
b = a_minus.operation(20, a, minus);
cout << "a = " << a << " and b = " << b << endl;
return 0;
}
et l'erreur évidente est:
ptrFunc.cpp: In function ‘int main()’:
ptrFunc.cpp:87:29: error: invalid use of non-static member function ‘int A::add(int, int)’
ptrFunc.cpp:88:30: error: invalid use of non-static member function ‘int A::subtract(int, int)’
coz je n'ai pas spécifié de l'objet à invoquer(et je ne veux pas utiliser des méthodes statiques pour l'instant)
EDIT:
plusieurs observations et réponses a suggéré que le non-version statique(comme je l'ai écrit) n'est pas possible.(merci à tous)
Donc,
La modification de la classe de la manière suivante également l'habitude de travailler:
#include <iostream>
using namespace std;
class A
{
int res;
public:
A(int choice)
{
int (*plus)(int, int) = A::add;
int (*minus)(int, int) = A::subtract;
if(choice == 1)
res = operation(7, 5, plus);
if(choice == 2)
res = operation(20, 2, minus);
cout << "result of operation = " << res;
}
int add(int first, int second)
{
return first + second;
}
int subtract(int first, int second)
{
return first - second;
}
int operation(int first, int second, int (*functocall)(int, int))
{
return (*functocall)(first, second);
}
};
int main()
{
int a, b;
A a_plus(1);
A a_minus(2);
return 0;
}
a généré cette erreur:
ptrFunc.cpp: In constructor ‘A::A(int)’:
ptrFunc.cpp:11:30: error: cannot convert ‘A::add’ from type ‘int (A::)(int, int)’ to type ‘int (*)(int, int)’
ptrFunc.cpp:12:31: error: cannot convert ‘A::subtract’ from type ‘int (A::)(int, int)’ to type ‘int (*)(int, int)’
mai je sais comment résoudre ce problème s'il vous plaît?
grâce
this
en tant que premier paramètre.Vous avez besoin de faire statiques. Ils semblent être naturellement statique de toute façon.
Je vais apporter des modifications à ma question. S'il vous plaît avoir un coup d'oeil et je vous la valeur de vos commentaires. merci
OriginalL'auteur rahman | 2013-04-02
Vous devez vous connecter pour publier un commentaire.
La syntaxe pour déclarer un pointeur de fonction membre de méthodes:
D'invoquer membre des méthodes d'utilisation .* ou ->* opérateur:
Également jeter un oeil à http://msdn.microsoft.com/en-us/library/b0x1aatf(v=vs. 80).aspx
Espère que cette aide.
Code complet:
pls essayer l'extrait de code ci-dessus. Il devrait fonctionner.
il fonctionne arun, merci
La plupart de bienvenue 🙂
Comment au sujet de mon dernier extrait de code. J'ai essayé d'appliquer votre solution. il ne fonctionne pas. pouvez-vous le vérifier?(s'il vous plaît)
OriginalL'auteur Arun
Vous ne pouvez pas passer non statique de la fonction de membre de l'argument facile. Et pour répondre à vos besoins, je pense qu'il est préférable de remplacer les opérateurs: http://www.learncpp.com/cpp-tutorial/92-overloading-the-arithmetic-operators/
Mais si vous avez vraiment besoin d'eux comme de véritables fonctions de membre de tout à fait statique.
Après les changements, ma réponse est toujours debout. Comme Alok Enregistrer l'a souligné, les fonctions de membres ont encore implicite de ce en tant que premier paramètre. De nouvelles erreurs sont générées sont en fait de répondre à votre question: (*)(int,int) déclaration n'est pas (::) (int,int) - vous devez changer de déclaration et de déréférencement de façon appropriée. Vous devriez probablement vous nous dire les raisons pourquoi vous ne pouvez pas avoir statiques ou, mieux encore, ont remplacé les opérateurs, leur logique demande juste de rendre statique 🙂
OriginalL'auteur Stan McGeek
La modification que vous faites de votre code est toujours faux, car il ne fait pas les fonctions membres statiques. Vous avez besoin de faire l'addition, soustraction, etc. fonctions statiques par l'ajout de la
static
rédacteur de devis:OriginalL'auteur maditya
Voir le code ci-dessous. Les appels de fonction sont de travail, sans pour autant rendre statique.
OriginalL'auteur Pruthviraj