类前向声明​​ libtorrent

Posted

技术标签:

【中文标题】类前向声明​​ libtorrent【英文标题】:Class forward declaration libtorrent 【发布时间】:2015-03-07 12:36:37 【问题描述】:

我如何正确转发声明一个类?

//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 是未定义的。

【问题讨论】:

我不确定你在问什么,但这不是如何前向声明一个类,顺便说一句。 'session' 是类,如果在 'man.cpp' '_tWinMain' 中定义,则在 'client_functions.cpp' 中无法识别。 【参考方案1】:

听起来您想要一个由多个翻译单元共享的全局 session 实例。你可以做的是,在一个翻译单元/cpp 文件中define Sess,像这样(假设这是你的 main.cpp):

libtorrent::session Sess;

在其头文件(main.hpp)中,包含:

extern libtorrent::session Sess;

在任何其他要使用会话的翻译单元/cpp文件中,确保包含头文件(main.hpp),然后您可以使用main.cpp创建的实例

【讨论】:

【参考方案2】:

而不是声明session Sess 而是声明session *Sess。这样你就可以从你的函数中控制Sess 的生命周期。您可以在例如创建它main() 并在最后执行的函数中销毁它。要创建它,请执行Sess = new session;,要销毁它,请执行delete Sess;

缺点是您必须用Sess-&gt; 搜索/替换所有Sess.

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

【讨论】:

以上是关于类前向声明​​ libtorrent的主要内容,如果未能解决你的问题,请参考以下文章

class 类前向声明

类前向声明​​失败,没有递归包含

c++示例内存25未初化填充,移动

c++内存示例23未初化复制,默认构造

c++内存示例06消灭

前向声明