0

在我一直在做的一个项目中,我使用了 boost 的信号2。在我开始使用虚拟课程之前,这一直很好。现在插槽不再被调用。以下是我的项目的精简版。

Glue 类创建 VSig 和 Process 类的实例,并将 VSig 中的信号连接到 Process 中的插槽。

IVSig.h:

class IVSig {
public:
    boost::signals2::signal<void (void)> sigTest;
    virtual void update() = 0;
};

VSig.h:

class VSig : public IVSig {
public:
    boost::signals2::signal<void (void)> sigTest;
    void update();
};

VSig.cpp:

void VSig::update()
{
    printf("updating!\n");
    sigTest();
}

进程.h:

class Process {
public:
    void process();
};

进程.cpp:

void Process::process()
{
    printf("hi!\n");
}

胶水.h:

class Glue {
public:
    Glue();
    void callUpdate();

private:
    IVSig *sig;
    Process *proc;
};

胶水.cpp:

Glue::Glue()
{
    sig = new VSig();
    proc = new Process();

    sig->sigTest.connect(boost::bind(&Process::process, proc));

    callUpdate();
}

void Glue::callUpdate()
{
    sig->update();
}

这应该打印“更新!” 接着是“嗨!” 但只输出“更新!”。

非常感谢任何帮助或建议!

4

1 回答 1

1

问题是因为您在 VSig 类中重新声明 sigTest,并且当您使用 sig->sigTest 时,您正在访问 IVSig 类的sigTest成员(声明的类型),但是在执行更新时,您正在调用虚拟更新方法,这将使用它的本地 sigTest 变量。不确定我是否足够清楚。

因此,经验法则是:永远不要在继承的类中重新定义具有相同名称的变量。

希望有帮助!

于 2013-01-10T12:58:40.480 回答