0

クラスを適切に前方宣言するにはどうすればよいですか?

//client_functions.cpp
using namespace libtorrent;
session Sess;

bool Start_Client_Sess( )
{
    Sess.add_extension ( create_ut_pex_plugin );
    Sess.add_extension ( create_ut_metadata_plugin );
    Sess.add_extension ( create_lt_trackers_plugin );
    Sess.add_extension ( create_smart_ban_plugin );
    Sess.start_upnp( );
    Sess.start_natpmp( );
    Sess.start_dht( );
    Sess.start_lsd( );
    error_code e;
    Sess.listen_on ( std::make_pair ( 6881 , 6889 ) , e );

    if ( e )
    {
        #ifdef DEBUG_CONSOLE
        std::cout << "Start Client failed\n";
        #endif
        return false;
    }

    return true;
}

私が抱えている問題は、コードが1つしかないSess方法であり、それが、各クライアント関数で宣言されているかのようにする必要がある方法ですsession Sess;新しいセッションが作成されますがsession Sess;、関数の外側で宣言されているため、アプリケーションは適切に閉じませんSessには独自のスレッドがあり、アプリケーションへの 2 番目の呼び出しからコマンド ライン引数を取得すると、2 番目のインスタンスがハングします。

session Sess;私はそこにいる必要があると思いますが、そこに置くと、未定義であると不平を言う場所で_tWinMainエラーが発生します。client_functions.cppSess

4

2 に答える 2

2

session複数の翻訳単位で共有される1 つのグローバル インスタンスが必要なようです。できることは、1 つの翻訳単位/cpp ファイルで、次のように Sess を定義することです (これが main.cpp であるとします)。

libtorrent::session Sess;

そのヘッダー ファイル (main.hpp) に、以下を含めます。

extern libtorrent::session Sess;

セッションを使用する他の翻訳単位/cpp ファイルでは、必ずヘッダー ファイル (main.hpp) をインクルードしてください。そうすれば、main.cpp によって作成されたインスタンスを使用できます。

于 2015-03-08T15:07:47.913 に答える
1

session Sess宣言する代わりに宣言しsession *Sessます。そうすれば、関数の寿命を制御できSessます。たとえばmain()、それを作成し、最後に実行される関数で破棄できます。作成するには を実行Sess = new session;し、破棄するには を実行しdelete Sess;ます。

欠点は、すべてを で検索/置換する必要があることSess.ですSess->

externところで、グローバル変数を参照するために使用する方が適切です。たとえばextern session *Sess、実際にそれを宣言するファイルを除くすべてのファイルで使用します (おそらく、それを作成するファイル、たとえばmain().

于 2015-03-07T16:23:32.670 に答える