【问题标题】:Static array of method pointers方法指针的静态数组
【发布时间】:2011-09-22 19:53:46
【问题描述】:

我遇到了一个我不明白的错误。

我尝试创建和使用方法指针的静态数组。我班级的声明如下所示:

static void (Client::*packetHandler[Op::handledOpcodeMax - Op::handledOpcodeMin + 1])(QByteArray &data);

在我的 .cpp 文件中进行初始化是这样的:

void (Client::*packetHandler[Op::handledOpcodeMax - Op::handledOpcodeMin + 1])(QByteArray &data);

麻烦来了,在我的客户的一个类方法中,我尝试使用这个方法指针的数组。 我尝试了几种方法,例如:

(this->*packetHandler[_opcode])(data);

我说我不明白这个问题,让我解释一下原因。在我的代码上运行 make 会导致正确编译,tought,链接时出现问题。

client.cpp:71: undefined reference to `Client::packetHandler'

此消息重复 5 次。

欢迎任何帮助。 谢谢。

【问题讨论】:

  • 静态变量是翻译单元的本地变量。也许出口会是有序的。
  • 告诉你改用 boost::function 会不会太讨厌了?
  • 我强烈推荐一些 typedef 来清理这个烂摊子。
  • 头文件中是否存在几行?
  • @KerrekSB typedefs 会让那些更干净,但不是那么有趣。

标签: c++ pointers static static-array


【解决方案1】:

void (Client::*packetHandler[Op::handledOpcodeMax - Op::handledOpcodeMin + 1])(QByteArray &data); 声明了一个名为 packetHandler 的全局变量。你想定义你的类变量,它需要一个额外的Client::,像这样:

void (Client::*Client::packetHandler[Op::handledOpcodeMax - Op::handledOpcodeMin + 1])(QByteArray &data);

【讨论】:

  • 哈哈谢谢尼尔。在@thekashyap 评论之后,我在想这样的事情。我试过void (Client::Client::*packetHandler[Op::handledOpcodeMax - Op::handledOpcodeMin + 1])(QByteArray &data);* 位置运气不好:D。谢谢:)
  • 只是为了说明 Kerrek SB 的评论 abt typedefing 的重要性.. :)
【解决方案2】:

Client::*packetHandler 是一个成员函数指针,指向一个名为Client::packetHandler 的成员函数。我不确定如何创建一个指向任意成员函数的成员函数指针,这似乎是您想要做的。我认为乔治是对的。您应该考虑使用 boost::functionstd::tr1::function 之类的东西,或者编写自己的成员函数包装类。

【讨论】:

  • 要使函数指针指向您想要的任何成员函数很简单,您无需做任何特别的事情。我的问题是我希望这个数组成为我班级的静态元素。删除头文件中的static 关键字使编译和链接工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多