在我一直在做的一个项目中,我使用了boost的signals2。在我开始使用虚拟类之前,这个方法运行得很好。现在插槽不再被调用了。以下是我的项目的精简版本。
Class 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();
}Process.h:
class Process {
public:
void process();
};Process.cpp:
void Process::process()
{
printf("hi!\n");
}Glue.h:
class Glue {
public:
Glue();
void callUpdate();
private:
IVSig *sig;
Process *proc;
};Glue.cpp:
Glue::Glue()
{
sig = new VSig();
proc = new Process();
sig->sigTest.connect(boost::bind(&Process::process, proc));
callUpdate();
}
void Glue::callUpdate()
{
sig->update();
}这应该会打印“正在更新!”后面跟着“嗨!”但是只输出‘更新!’。
任何帮助或建议,我们都非常感谢!
发布于 2013-01-10 20:58:40
问题是因为您在VSig类中重新声明了sigTest,并且当您使用sig->sigTest时,您将访问IVSig类的 sigTest 成员(声明的类型),但是当执行更新时,您将调用虚拟更新方法,该方法将使用它的本地sigTest变量。不确定我说的够不够清楚。
因此,经验法则是:永远不要在继承的类中重新定义同名的变量。
希望这能有所帮助!
https://stackoverflow.com/questions/14258403
复制相似问题