【发布时间】:2014-12-04 15:35:33
【问题描述】:
我受够了,我真的筋疲力尽了。我是 C++ 新手。但是我已经阅读了很多关于此的内容,但仍然不明白实现这个的正确方法是什么。
我刚刚复制了这篇文章中的所有代码Signal Handling in C++
但是还是不行!!!我创建了新类 Signal Handler....复制本文中的所有内容,但仍然是这个....错误消息“未定义的引用 ....”。我真的很困惑。请解释如何正确执行此操作以及为什么我总是收到此消息。
这里只是从文章中复制的代码。
SignalHandler.h
#ifndef SIGNALHANDLER_H
#define SIGNALHANDLER_H
#include "eventhandler.h"
#include <signal.h>
class SignalHandler
{
public:
// Entry point.
static SignalHandler *getInstance (void);
// Register an event handler <eh> for <signum>
// and return a pointer to any existing <Event_Handler>
// that was previously registered to handle <signum>.
EventHandler* registerHandler (int signum,EventHandler *eh);
// Remove the <Event_Handler> for <signum>
// by setting the slot in the <signal_handlers_>
// table to NULL.
int removeHandler (int signum);
private:
// Ensure we're a Singleton.
SignalHandler (void);
// Singleton pointer.
static SignalHandler *instance;
// Entry point adapter installed into <sigaction>
// (must be a static method or a stand-alone
// extern "C" function).
static void dispatcher (int signum);
// Table of pointers to concrete <Event_Handler>s
// registered by applications. NSIG is the number of
// signals defined in </usr/include/sys/signal.h>.
static EventHandler *signalHandlers[NSIG];
};
#endif // SIGNALHANDLER_H
SignalHandler.cpp
#include "signalhandler.h"
EventHandler* SignalHandler::registerHandler (int signum,EventHandler *eh)
{
// Copy the <old_eh> from the <signum> slot in
// the <signal_handlers_> table.
EventHandler *oldEh = SignalHandler::signalHandlers[signum];
// Store <eh> into the <signum> slot in the
// <signal_handlers_> table.
SignalHandler::signalHandlers[signum] = eh;
// Register the <dispatcher> to handle this
// <signum>.
struct sigaction sa;
sa.sa_handler = SignalHandler::dispatcher;
sigemptyset (&sa.sa_mask);
sa.sa_flags = 0;
sigaction (signum, &sa, 0);
return oldEh;
}
void SignalHandler::dispatcher (int signum)
{
// Perform a sanity check...
if (SignalHandler::signalHandlers[signum] != 0) {
// Dispatch the handler's hook method.
SignalHandler::signalHandlers[signum]->handleSignal(signum);
}
}
为什么我会收到此消息......
error: undefined reference to `SignalHandler::signalHandlers'
error: undefined reference to `SignalHandler::signalHandlers'
请注意,我刚刚从文章中复制了这一点。 我真的希望你的帮助。谢谢。
【问题讨论】:
-
如果您是 C++ 新手,您应该了解如何在 C++ 类中初始化静态变量。任何静态变量都必须在各自的 cpp 源文件中显式初始化...
标签: c++ events signals undefined-reference