2015-01-06 1 views
11

Für die Zeit lerne ich mit Boost/Asio Code zu programmieren. Viele Codebeispiele verwenden die Kombination aus async_accept und bind. Im Server-Code, ich über irgendeine Sache wie diese kommen:Wie schaffen es diese zwei Funktionen, die in derselben Klasse definiert sind, einander ohne Forward-Deklaration aufzurufen?

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

    } 
}; 

Wenn ich eine Instanz von Tcp_server machen und entweder handle_accept rufen oder akzeptieren beginnen, es funktioniert. Aber wenn ich die Tcp_server-Klasse-Kapselung ablege, würde sich der Compiler beschweren "handle_accept ist nicht deklariert". Ich frage mich nur, ob der Compiler alle Funktionen, die in derselben Klasse definiert sind, automatisch weiterleitet. Kann mir jemand erklären warum?

Antwort

9

Funktionen, die in der Definition einer Klasse definiert sind, haben genau die gleiche Semantik, als wenn sie nur in der Klassendefinition deklariert und dann unmittelbar nach der Klassendefinition definiert würden. Der einzige Unterschied besteht darin, dass solche Memberfunktionen implizit als Inline deklariert werden, während eine Funktionsdefinition entweder nicht inline oder explizit inline ist. Das heißt, vom Standpunkt des Compilers aus werden die Funktionen deklariert und die Klasse wird definiert, bevor die Funktionsdefinitionen berücksichtigt werden.

Der Grund für die Definition der Funktion nach der Klassendefinition ist einfach: Ohne diese wäre die Klasse unvollständig und das Nachschlagen von Elementen würde fehlschlagen, was für Elementfunktionsdefinitionen eindeutig nicht wünschenswert ist. Als Nebeneffekt können sich Funktionen leicht aufeinander beziehen. Da das Definieren von Elementfunktionen in der Klassendefinition hauptsächlich der Bequemlichkeit dient, wäre es auch etwas unpraktisch, eine Deklaration für später verwendete Elementfunktionen zu verlangen.

+1

Aber ist nicht die Frage, warum diese Designentscheidung (wahrscheinlich) gemacht wurde? Ich bin sehr neugierig darauf, BTW. – Drop

+1

wie @Drop sagte, was ist der Grund dafür? – spiritsaway

+2

@Drop Der Grund für diese Entscheidung ist, dass, wenn der Standard eine Forward-Deklaration in Fällen erfordern würde, in denen Deklarationen mit Definitionen kombiniert werden, das Definieren von Funktionen innerhalb der Klasse wesentlich unpraktischer würde, bis zu dem Punkt, an dem man das Feature vollständig verwenden könnte . – dasblinkenlight

Verwandte Themen