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?
Ale nie chodzi o to, dlaczego ta decyzja projektowa została (prawdopodobnie) podjęta? Jestem bardzo ciekawy, BTW. – Drop
tak jak @Drop powiedział, jakie jest uzasadnienie tego? – spiritsaway
@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