2009-06-30 11 views
14

Stavo cercando di scrivere una classe in C++ e mi sono imbattuto in un problema piuttosto strano: chiamare funzioni esterne all'interno di una classe che ha lo stesso nome come la classe. E 'un po' di confusione, ecco un esempio:C++ - Chiamare una funzione all'interno di una classe con lo stesso nome della 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."); 
} 

Il compilatore si lamenta alla penultima riga che non riesce a trovare una funzione A (char *), perché è all'interno della classe, e il costruttore ha lo stesso nome della funzione. Potrei scrivere un'altra funzione al di fuori, come:

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

E poi chiamare outsideA all'interno di A :: C, ma questa sembra una soluzione stupida al problema. Qualcuno sa di un modo più corretto per risolvere questo?

risposta

35

dovrebbe funzionare bene. Fondamentalmente si sta dicendo "utilizzare il A trovato nel namespace globale"

2

Ti suggerisco di utilizzare gli spazi dei nomi. Metti la tua classe in un namespace diverso rispetto alla funzione.

namespace my_namespace1 
{ 

void A() {} 

} 

namespace my_namespace2 
{ 

struct A {}; 

} 


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

Ovviamente, la vera domanda è: perché hai una classe e una funzione con un nome diverso? Una buona regola è quella di creare classi denominate WithABeginningCapitalLetter e funzioni withoutOne. Quindi non avrai mai questo problema. Naturalmente, il STL non lo fa ...

5

Utilizzare il scope resolution operator:: per accedere al nome dal campo di applicazione globale:

void A::C() { 
    ::A("Hello, world."); 
} 
Problemi correlati