2015-01-06 29 views
11

Na czas uczenia się kodu z boost/asio. Wiele próbek kodu korzysta z kombinacji async_accept i bind. W kodzie serwera, i natknąć niektóre rzeczy tak:W jaki sposób te dwie funkcje zdefiniowane w tej samej klasie mogą nawiązywać połączenia bez przesyłania zgłoszenia?

class Tcp_server 
{ 
public: 
    Tcp_server() 
    { 

    } 
    void start_accept(int a) 
    { 
     if(a>0) 
     { 
      cout<<a<<endl; 
      handle_accept(a-1); 
     } 

    } 

    void handle_accept(int a) 
    { 
     if(a>0) 
     { 
      cout<<a<<endl; 
      start_accept(a-1); 
     } 

    } 
}; 

Jeśli zrobię wystąpienie Tcp_server i zadzwonić albo handle_accept lub zacząć akceptować, to działa. Ale jeśli upuszczę enkapsulację klasy Tcp_server, kompilator będzie narzekał, że "handle_accept nie jest zadeklarowane". Zastanawiam się tylko, czy kompilator automatycznie przesyła dalej deklaruje wszystkie funkcje zdefiniowane w tej samej klasie. Czy ktoś może wyjaśnić, dlaczego?

Odpowiedz

9

Funkcje zdefiniowane w definicji klasy mają dokładnie taką samą semantykę, jak gdyby były zadeklarowane tylko w definicji klasy, a następnie zdefiniowane bezpośrednio po definicji klasy. Jedyna różnica polega na tym, że takie funkcje składowe są niejawnie deklarowane w linii, podczas gdy definicja funkcji nie jest wbudowana lub bezpośrednio wbudowana. Oznacza to, że z punktu widzenia kompilatora funkcje są zadeklarowane, a klasa jest zdefiniowana przed uwzględnieniem definicji funkcji.

Powód definiowania funkcji po definicji klasy jest prosty: bez tego klasa byłaby niekompletna i przeglądy elementów zakończyłyby się niepowodzeniem, co jest wyraźnie niepożądane dla definicji funkcji składowych. Jako efekt uboczny, funkcje mogą się łatwo odnieść do siebie. Ponieważ definiowanie funkcji składowych w definicji klasy jest przede wszystkim dla wygody, byłoby również niewygodnie wymagać deklaracji dla funkcji składowych używanych później.

+1

Ale nie chodzi o to, dlaczego ta decyzja projektowa została (prawdopodobnie) podjęta? Jestem bardzo ciekawy, BTW. – Drop

+1

tak jak @Drop powiedział, jakie jest uzasadnienie tego? – spiritsaway

+2

@Drop Powodem tej decyzji jest to, że jeśli standard miałby wymagać zgłoszenia do przodu w przypadkach, gdy deklaracje są połączone z definicjami, zdefiniowanie funkcji w klasie stałoby się znacznie mniej wygodne, do momentu, w którym można by całkowicie przestać używać tej funkcji. . – dasblinkenlight