2009-06-30 87 views
14

Estaba intentando escribir una clase en C++, y encontré un problema bastante extraño: llamar a funciones externas dentro de una clase que tiene el mismo nombre como la clase. Es un poco confuso, así que aquí está un ejemplo:C++ - Llamar a una función dentro de una clase con el mismo nombre que la clase

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."); 
} 

El compilador se queja en la segunda a la última línea que no puede encontrar una función A (char *), porque está dentro de la clase, y el constructor tiene el mismo nombre que la función. Podría escribir otra función fuera, como:

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

y luego llamar outsideA interior de un :: C, pero esto parece ser una solución al problema tonta. ¿Alguien sabe de una forma más adecuada de resolver esto?

Respuesta

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

debería funcionar bien. Básicamente se está diciendo "utilizar el A encontrado en el espacio de nombres global"

2

Sugiero que use espacios de nombres. Pon tu clase en un espacio de nombre diferente a la función.

namespace my_namespace1 
{ 

void A() {} 

} 

namespace my_namespace2 
{ 

struct A {}; 

} 


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

Por supuesto, la verdadera pregunta es, ¿por qué tiene una clase y una función con un nombre diferente? Una buena regla fácil es crear clases llamadas WithABeginningCapitalLetter y funciones withoutOne. Entonces nunca tendrás este problema. Por supuesto, el STL no hace esto ...

Cuestiones relacionadas