2010-11-10 3 views
2

Qu'est-ce que cela signifie quand je déclare dans mon code quelque chose comme: Foo * foo(); Quels sont les avantages pour moi? Ist pas simple variable de pointeur comme vous voyez. également Qu'est-ce que cela signifie si je déclare dans le C++ source au-dessus de toutes les méthodes, par exemple:Qu'est-ce que cela signifie si je déclare un pointeur de fonction en C++?

// Test cpp class 
. 

    #include "Foo.h" 
    Foo * foo(); 

    Test::Test() {} 
    Test::GetFooMethods() 
    { 
     foo()->someMethod(); 
    } 
    … 
    … 
+0

Qu'est-ce que votre livre a à dire? – GManNickG

Répondre

7

Foo * foo(); est une déclaration à une fonction nommée foo qui renvoie un pointeur sur un objet Foo. C'est pas un pointeur de fonction. Le code Foo()->someMethod(); est probablement une faute de frappe. Vous avez probablement voulu dire foo()->someMethod();. Dans ce cas, le code appelle foo() qui, comme indiqué ci-dessus renvoie un pointeur vers un objet Foo, puis vous appelez la méthode Foo::someMethod() via ce pointeur.

Si en fait vous vouliez dire Foo()->someMethod(); les choses deviennent un peu folles. Cela signifie qu'un objet Foo est initialisé par défaut sur la pile. Puis Foo::operator->() est appelée, retournant un objet qui a une méthode nommée someMethod(), et cette fonction est appelée. Voir pourquoi je suppose que c'était une faute de frappe? :)

EDIT:

Pour répondre à la dernière question de votre poste, lorsque vous déclarez une fonction sans le définir, vous dites au compilateur, «J'ai une fonction nommée foo qui ne prend aucun paramètre et renvoie un pointeur vers un Foo, mais je ne vais pas vous dire comment cette fonction est encore implémentée. " Cela vous permet d'écrire du code qui utilise cette fonction et le compilateur sera heureux. L'éditeur de liens sera cependant assez grincheux si vous ne fournissez pas de définition pour cette fonction.

+0

Ah; bonne prise de la capitale 'F'. –

+0

@James: ty, bonne explication à quoi ressemblerait vraiment un pointeur de fonction. –

+0

a corrigé le type, donc c'est comme Foo * foo = new Foo()? – user63898

7
Foo * foo(); 

Ce n'est pas un pointeur de fonction. Ceci est une déclaration d'une fonction nommée foo qui ne prend aucun argument et renvoie un pointeur vers un Foo.

Un pointeur sur une fonction de ce type ressemblerait à ceci:

Foo* (*foo_ptr)() = foo; 
1

Tout comme

int getX(); 

est une déclaration d'une fonction qui retourne un entier, donc trop

Foo * foo(); 

est une déclaration d'une fonction qui renvoie un pointeur Foo;

1

Qu'est-ce que cela signifie quand je dans mon code déclare quelque chose comme: Foo * foo();

Foo * foo(); 

Très difficile à dire sans savoir ce qui est Foo.

Si Foo est un type, par ex. struct Foo{};, alors cela déclare une fonction nommée 'foo' qui renvoie un pointeur sur un type appelé Foo. Cela semble être le cas dans votre message en fonction de votre utilisation par la suite (et aussi le titre de la poste).

Si Foo est un #define e.g. #define Foo 1, alors ce n'est pas une déclaration mais une expression qui multiplie 1 par la valeur de retour de 'foo' dans le cas où l'opérateur * est défini pour les types d'opérandes impliqués.

Quels sont les avantages que cela procure?

Difficile à dire à nouveau sans savoir ce qu'est Foo.

Aussi Qu'est-ce que cela signifie si je le déclare dans le C++ source au-dessus de toutes les méthodes

Déclarer « foo » (si elle est en effet une déclaration) le plus haut possible dans les moyens de l'unité de traduction plus grande la portée provisoire du nom «foo».

void f1(){g();} // not OK, 'g' not known 

void f(){} 

void g(){f();} // OK, f() is known 

BTW, ne Foo (CAPS F) ont un opérateur surchargé ->?

+0

+1 pour une illustration des trucs fous qui se produisent lorsque les gens utilisent des macros. –

Questions connexes