2009-06-30 8 views
14

J'essayais d'écrire une classe en C++, et je suis tombé sur un problème plutôt étrange: appeler des fonctions externes à l'intérieur d'une classe ayant le même nom comme la classe. Il est un peu déroutant, donc voici un exemple:C++ - Appeler une fonction dans une classe avec le même nom que la classe

void A(char* D) { 
    printf(D); 
} 

class A 
{ 
public: 
    A(int B); 
    void C(); 
}; 

A::A(int B) { 
    // something here 
} 

void A::C() { 
    A("Hello, World."); 
} 

Le compilateur se plaint à la deuxième à la dernière ligne qu'il ne peut pas trouver une fonction A (char *), parce qu'il est à l'intérieur de la classe, et le constructeur a le même nom que la fonction. Je pourrais écrire une autre fonction en dehors, comme:

ousideA(char* D) { 
    A(D); 
} 

Et puis appelez outsideA l'intérieur de A :: C, mais cela semble être une solution stupide au problème. Quelqu'un sait-il d'une manière plus appropriée de résoudre ceci?

Répondre

35
::A("Hello, world."); 

devrait fonctionner correctement. Fondamentalement, il dit « utiliser le A trouvé dans l'espace de noms global »

2

Je vous suggère d'utiliser des espaces de noms. Mettez votre classe dans un espace de noms différent de la fonction.

namespace my_namespace1 
{ 

void A() {} 

} 

namespace my_namespace2 
{ 

struct A {}; 

} 


int main() 
{ 
    my_namespace1::A(); 
    my_namespace2::A my_a;  
} 

Bien sûr, la vraie question est, pourquoi avez-vous une classe et une fonction avec un nom différent? Une bonne règle facile est de faire des classes nommées WithABeginningCapitalLetter et des fonctions sansOne. Alors vous n'aurez jamais ce problème. Bien sûr, la STL ne fait pas cela ...

Questions connexes