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

我遇到的问题是代码如何只有一个Sess,这就是它需要的方式,好像session Sess;在每个客户端函数中声明了一个新会话,但现在正如session Sess;在函数之外声明的那样,应用程序无法正确关闭Sess有它自己的线程并且从对应用程序的第二次调用获取命令行参数会导致第二个实例挂起。

我想我需要session Sess;加入,_tWinMain但把它放在那里会给我client_functions.cpp抱怨它Sess未定义的错误。

4

2 回答 2

2

听起来您想要一个session由多个翻译单元共享的全局实例。您可以做的是,在一个翻译单元/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 Sessdeclare session *Sess。这样您就可以控制Sess函数的生命周期。您可以在 eg 中创建它main()并在最后执行的函数中销毁它。要创建它,做它Sess = new session;和销毁它,做一个delete Sess;.

缺点是您必须搜索/替换Sess.所有Sess->.

extern顺便说一句,使用引用全局变量更合适,例如extern session *Sess在每个文件中,除了实际声明它的文件(可能是创建它的文件,例如 from main().

于 2015-03-07T16:23:32.670 回答