繁体   English   中英

C ++静态函数指针数组的初始化

[英]C++ Initialization of static function pointer array

我想创建一个静态函数指针数组,因此可以跳转到有关接收到的索引的某个函数。 就像索引跳线一样。

因此,想象一个像这样的类:

Class A 
{ 
  private:
  static void 1stFunction();
  static void 2ndFunction();

  static void(*functionPointer[20])(void);

};

然后,我希望那个functionPointer获得1stFunction和2ndFunction的值,甚至更多。 那么,如何初始化它? 据我所知,声明静态成员后,甚至可以在创建实例之前使用它。 因此,尽管如此,让我们初始化该函数指针,以便以后我可以像这样调用它

functionPointer[receivedIndex]();

所以我试图在相同的.h文件中像这样初始化它

void (*A::functionPointer[])(void) =
{
    A::1stFunction,
    A::2ndFunction,
};

但是编译器给了我重新定义,说它已经创建了。

所以,很确定我缺少什么。 我不知道,如果是语法还是根本就不可能这样。 我知道指向类成员函数的函数指针与普通函数指针不同……但这是一个静态函数,因此我认为它不属于实例,因此应该与普通函数指针一起使用。

任何帮助,将不胜感激。 谢谢

以下将是一个可能会满足您需要的工作示例。

您需要C++11作为初始化列表。

最好在cpp文件中初始化静态成员,因为您不希望在每次包含标头时都对静态成员进行定义(这可能会导致链接问题)。

您可以根据函数指针数组的初始化,使用所需的index调用callf并调用相应的函数。

该程序的输出为:

I am 2ndFunction

头文件

class A
{
private:
  static void Function1();
  static void Function2();

  static void(*functionPointer[20])();

public:
  static void callf(int index);
};

实作

#include <iostream>
#include "ex.h"

void(*A::functionPointer[20])() {
  A::Function1,
  A::Function2
};

void A::Function1() {
  std::cout << "I am 1stFunction" << std::endl;
}

void A::Function2() {
  std::cout << "I am 2ndFunction" << std::endl;
}

void A::callf(int index) {
  A::functionPointer[index]();
}

int main(int argc, char const *argv[]) {
  A::callf(1);
  return 0;
}

在这里,您有一个更现代的C ++方法(需要C ++ 14),如果您不限于C ++ 03,我建议您探索lambda函数。

#include <iostream>
#include <functional>
#include <vector>

class A {
public:

  using f_type = std::function<void(void)>;
  f_type f1 = []() { std::cout << "f0" << std::endl;};
  f_type f2 = []() { std::cout << "f1" << std::endl;};
  static void f3() { std::cout << "f3" << std::endl; }

  std::vector<f_type> functions{f1, f2, f3};

};


int main() {

  A a;
  a.functions[0]();
  a.functions[1]();
  //adding custom lambda
  a.functions.emplace_back([](){ std::cout << "custom f" << std::endl;});
  a.functions[2]();

  return 0;
}

您可以将函数和lambda都添加到容器中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM