【问题标题】:Boost signals : Connect fails升压信号:连接失败
【发布时间】:2013-11-15 06:29:10
【问题描述】:

我在一个 C++ 类(我们称之为 classA)中有一个公共方法,它被定义为:

void someFunction(someOtherCppClassB* arg);

此“someFunction”方法执行以下操作:

theConnection = registerFunction(aPtrToAnInstanceOfCStruct1, boost::bind(&classA::callbackFunction, this, _1));

其中 'theConnection' 是 ClassA 中的私有成员变量,其类型为 boost::signals2::connection

其中 'callbackFunction' 是 classA 中的私有方法,定义为:

int callbackFunction(cStruct2** doublePtr);

其中 'aPtrToAnInstanceOfCStruct1' 是指向此 C 结构实例的指针:

typedef struct cStruct1T
{
       boost::signals2::signal<int (cStruct2**)> signalVariable;
} cStruct1

而cStruct2定义为:

typedef struct cStruct2T
{
   /* Variables in this struct */
       char someDummyVariable;
} cStruct2

'registerFunction' 定义为:

boost::signals2::connection registerFunction(cStruct1* aPtrToAnInstanceOfCStruct1, boost::function<int (cStruct2**)> someCallbackFunction)
{
        /* THIS FAILS FOR SOME REASON */
        return aPtrToAnInstanceOfCStruct1->signalVariable.connect(someCallbackFunction);

}

由于某种原因,.connect() 在 Android 4.3 上生成以下内容:

F/libc (8556):致命信号 11 (SIGSEGV) 位于 0x0000000c (code=1),线程 8556

我无法弄清楚导致错误的原因。所以我希望有一个 Boost 专家可以看看上面的代码并告诉我我做错了什么。

谢谢。

【问题讨论】:

    标签: android c++ c boost android-ndk


    【解决方案1】:

    很抱歉,我觉得你的例子很难学。但既然它编译了,我怀疑你可能有一个空指针,从错误代码来看。

    我建议将信号代码封装在包含信号的类中,并提供一个函数来连接您的slot,例如:

    typedef struct cStruct1T
    {
       typedef boost::signals2::signal<int (cStruct2**)> SignalTypeName;
       SignalTypeName signalVariable;
    
       void connectSlot(const SignalTypeName::slot_type& slot)
       { signalVariable.connect(slot); }
    
    } cStruct1;
    

    然后您可以像这样在someFunction 中注册您的插槽:

    aPtrToAnInstanceOfCStruct1->connectSlot(boost::bind(&classA::callbackFunction, this, _1));
    

    【讨论】:

    • 那行得通。为什么必须在结构中声明“connectSlot”?
    • 我很高兴听到它对您有用。您没有必须在结构中声明connectSlot。因为signalVariable 是公开的,您可以在任何地方拨打signalVariable.connect(..)。但是,我通常将我的信号声明为私有的,因此我必须提供一种将插槽连接到信号的方法。此外,它将信号代码保持在一起,这使得维护更容易,例如,如果 boost::signals2 被弃用,就像 boost::signals 只是...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2012-05-25
    • 2021-06-13
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多