【问题标题】:Undefined refernce static member C++ [duplicate]未定义的引用静态成员C++ [重复]
【发布时间】: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


【解决方案1】:

您必须定义静态数组。在类定义中,它只被声明。写在cpp模块中

EventHandler * SignalHandler::signalHandlers[NSIG];

【讨论】:

  • 感谢您的回答,它确实有效。你能给出任何好的文章来阅读这个。为什么这应该在头文件和源文件中都定义。
  • @braohaufngec 对不起。我不知道合适的文章。最好阅读 C++ 标准。
【解决方案2】:

必须定义 ODR 使用的每个函数和对象。

static SignalHandler *instance; 在类范围内只声明该成员,并没有定义它。

将定义添加到一个翻译单元 (.cpp-file)。

SignalHandler* Signalhandler::instance;

对于所有其他 static 成员也是如此。

【讨论】:

  • 感谢您的回答,它确实有效。你能给出任何好的文章来阅读这个。为什么这应该在头文件和源文件中都定义。
  • @braohaufngec:两者都应该定义。类定义中的行只是一个前向声明,它只是对其他地方的定义的承诺,例如在另一个翻译单元中。
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 2021-12-13
相关资源
最近更新 更多