1

我正在关注官方文档,libsigc++-2.0并找到了这个示例

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都没有定义,因此这段代码不应该编译(但文档认为这段代码可以工作是理所当然的)。

更奇怪的是,如果我同时定义run()了类的构造函数和构造函数,无论如何我都看不到库的效果,显然信号不起作用,并且run在 no slot 中调用时main被激活。

我在这里忘记了什么?这东西应该怎么改写?

4

2 回答 2

2

文档似乎不完整。

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

AlienDetector::AlienDetector() {}

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

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

于 2014-01-06T16:32:19.907 回答
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其作为文本随附的预制文件(缺少功能实现)。不知何故,这个文件,以及本教程后面提到的其他文件,从未进入发布的产品中。

这种遗漏已经有一段时间了(参见一些邮件 档案),但并没有引起适当的注意来修复它。(教程在我链接到的电子邮件几个月后更新,但显然不是为了添加丢失的示例文件。)在链接的电子邮件中,作者提供了一个链接来获取丢失的文件,但在此后的十年中,链接已失效。

幸运的是,Petesh 在此处的较旧答案中为一些示例文件提供了寿命更长的源代码。(至于我,我只是过于详细和精确。太糟糕了,当我试图弄清楚这个问题可以记录在哪里以便可以解决或至少跟踪时,我迷路了。)

于 2019-03-30T10:03:02.297 回答