2015-01-06 3 views
11

私はboost/asioでコードすることを学んでいます。多くのコードサンプルでは、​​async_acceptとbindの組み合わせが使用されています。サーバーのコードでは、私はこのようないくつかのことに遭遇:同じクラスに定義されたこれらの2つの関数は、順方向宣言なしに互いにどのように呼び出すことができますか?

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

    } 
}; 

私はTcp_serverのインスタンスを作成し、handle_acceptのいずれかを呼び出すか、受け入れを開始した場合、それが動作します。しかし、私がTcp_serverクラスのカプセル化を落とすと、コンパイラは "handle_accept is not declared"と文句を言うでしょう。コンパイラが自動的に同じクラスに定義されているすべての関数を宣言しているかどうかは不思議です。なぜ誰かが説明できますか?

答えて

9

クラスの定義で定義された関数は、クラス定義でのみ宣言され、クラス定義の直後に定義されているのとまったく同じセマンティクスを持ちます。唯一の違いは、そのようなメンバ関数はインラインで暗黙的に宣言され、関数定義は非インラインまたは明示的にインラインであるということです。つまり、コンパイラの観点から関数が宣言され、関数定義が考慮される前にクラスが定義されます。

クラス定義の後で関数を定義する理由は単純です。クラスの定義が不完全で、メンバーのルックアップが失敗してしまい、メンバー関数の定義には好ましくないことが明らかです。副作用として、関数は互いに容易に参照できます。クラス定義におけるメンバ関数の定義は、便宜上のものであるため、後で使用されるメンバ関数の宣言を要求することはやや不便であろう。

+1

しかし、このデザインの決定が(おそらく)作られたのはなぜですか?私は知ることが非常に興味がある、BTW。 – Drop

+1

ちょうど@Dropが言ったように、これの背後にある根拠は何ですか? – spiritsaway

+2

@Dropこの決定の理由は、宣言が定義と組み合わされている場合に標準が前方宣言を要求していた場合、クラス内の関数の定義は、機能の使用を完全に止めることができる点。 – dasblinkenlight

関連する問題