官方libsigc ++ 2.0示例中的错误?

时间:2014-01-06 15:56:53

标签: c++ libsigc++

我正在关注libsigc++-2.0的官方文档,我找到了this example

class AlienDetector
{
public:
    AlienDetector();

    void run();

    sigc::signal<void> signal_detected;
};

void warn_people()
{
    cout << "There are aliens in the carpark!" << endl;
}

int main()
{
    AlienDetector mydetector;
    mydetector.signal_detected.connect( sigc::ptr_fun(warn_people) );

    mydetector.run();

    return 0;
}

正如您所看到的,run()函数和AlienDetector类的构造函数都没有定义,因此这段代码不应该编译(但是doc理所当然地认为这段代码将会工作)。

更奇怪的是,如果我定义了run()和类的构造函数,我无论如何都看不到库的效果,显然信号不起作用,而{{1在run中调用没有插槽被激活。

我忘记了什么?怎么重写这个东西?

2 个答案:

答案 0 :(得分:2)

文档似乎不完整。

代码的最基本版本应如下所示:

AlienDetector::AlienDetector() {}

void AlienDetector::run() {
    sleep(3); // wait for aliens
    signal_detected.emit(); // panic
}

我发布了一个功能齐全的基于make的示例on github,example1.cpp是第一个示例,example2.cpp是使用成员函数的示例。

答案 1 :(得分:0)

更准确地说,该文档的特定页面正确无误,并按预期显示,但缺少关键链接。回顾一下那里的内容后,我将介绍丢失的内容。问题中被列为一个块的代码在文档中被列为两个块:

  

这是我的课程:

<first code block, which
declares AlienDetector>
     

这是使用它的代码:

<second code block, which
defines warn_people() and
main()>

此拆分非常重要。呈现的学习场景是您必须编写与特定类接口的代码的场景。在这种情况下,您需要使用的信息是该类的声明,而不是该类的实现(头文件,而不是源)。因此,第一个代码块为函数提供了不带代码的声明。该演示适当地遗漏了您目前应该忽略的细节。

遗漏在页面的下方:

  

要编译此示例,请使用:

g++ example1.cc -o example1 `pkg-config --cflags --libs sigc++-2.0`

继续播放-“ example1.cc”吗?那是什么?您可能会注意到页面没有说明如何创建example1.cc。虽然很自然地认为应该将页面中的代码复制到此文件中,但这不是原意。作者原本打算将example1.cc用作文本的预制文件(具有缺少的函数实现)。不知何故,此文件以及本教程后面引用的其他文件从未进入发布的产品。

这种疏漏已经有一段时间了(请参阅mail archives),但是并没有引起正确的注意来解决它。 (本教程在我链接到电子邮件后的几个月后进行了更新,但显然并未添加缺少的示例文件。)在链接的电子邮件中,作者提供了一个链接以获取丢失的文件,但是从那时起的十年中,链接已过期。

幸运的是,Petesh在此处的较旧答案中为某些示例文件提供了寿命更长的源。 (对我来说,我只是过于详细和精确。太可惜了,我在试图找出可以记录此问题的位置以致于可以解决或至少跟踪该问题时迷失了。)