首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用虚拟类提升signals2

使用虚拟类提升signals2
EN

Stack Overflow用户
提问于 2013-01-10 20:53:16
回答 1查看 257关注 0票数 0

在我一直在做的一个项目中,我使用了boost的signals2。在我开始使用虚拟类之前,这个方法运行得很好。现在插槽不再被调用了。以下是我的项目的精简版本。

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

IVSig.h:

代码语言:javascript
复制
class IVSig {
public:
    boost::signals2::signal<void (void)> sigTest;
    virtual void update() = 0;
};

VSig.h:

代码语言:javascript
复制
class VSig : public IVSig {
public:
    boost::signals2::signal<void (void)> sigTest;
    void update();
};

VSig.cpp:

代码语言:javascript
复制
void VSig::update()
{
    printf("updating!\n");
    sigTest();
}

Process.h:

代码语言:javascript
复制
class Process {
public:
    void process();
};

Process.cpp:

代码语言:javascript
复制
void Process::process()
{
    printf("hi!\n");
}

Glue.h:

代码语言:javascript
复制
class Glue {
public:
    Glue();
    void callUpdate();

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

Glue.cpp:

代码语言:javascript
复制
Glue::Glue()
{
    sig = new VSig();
    proc = new Process();

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

    callUpdate();
}

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

这应该会打印“正在更新!”后面跟着“嗨!”但是只输出‘更新!’。

任何帮助或建议,我们都非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-10 20:58:40

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

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

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14258403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档