Ошибка в официальном примере libsigC++ 2.0?

Я следовал официальной документации для 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 называется в main слот не активирован.

Я забыл о чем-то здесь? Как эта вещь должна быть переписана?

1 ответ

Решение

Документация кажется неполной.

Самая базовая версия кода должна выглядеть так:

AlienDetector::AlienDetector() {}

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

Я разместил полностью функциональный пример на основе github, example1.cpp - первый пример, example2.cpp - пример использования функции-члена.

Чтобы быть более точным, эта конкретная страница документации является правильной и представлена ​​как задумано, но с отсутствующей ключевой ссылкой. Я вернусь к тому, чего не хватает после рассмотрения того, что там есть. Код, который указан как один блок в вопросе, представлен в документации двумя блоками:

Вот мой класс:

<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 предоставил более долгоживущий источник для некоторых примеров файлов в предыдущем ответе здесь. (Что касается меня, я просто слишком детализирован и точен. Жаль, что я заблудился, пытаясь выяснить, где эта проблема может быть зарегистрирована, чтобы ее можно было решить или, по крайней мере, отследить.)

Другие вопросы по тегам